Как правильно форматировать многострочный текст в Python?

184

В Python я хочу написать многострочный текст в моем коде. Существует несколько способов его форматирования. Вот некоторые из них, о которых я мог подумать:

  1. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3, }
  2. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3,
             }
  3. mydict = {
        "key1": 1,
        "key2": 2,
        "key3": 3,
    }

Я знаю, что все вышеперечисленное является синтаксически правильным, но я предполагаю, что есть один предпочтительный стиль отступов и разрывов строк для диктов Python. Что это?

Примечание: это не проблема синтаксиса. Все вышеперечисленное является (насколько мне известно) действительными утверждениями Python и эквивалентно друг другу.

Райан К. Томпсон
источник
12
Для 1 и 2: нет пробелов непосредственно внутри фигурных скобок, см. PEP 8.
Свен Марнах
3
Я хочу сказать, что в модуле python pprint он использует ваш первый пример, без пробелов непосредственно внутри фигурных скобок.
charmoniumQ

Ответы:

239

Я использую № 3. То же самое для длинных списков, кортежей и т. Д. Не требует добавления лишних пробелов за отступы. Как всегда, будьте последовательны.

mydict = {
    "key1": 1,
    "key2": 2,
    "key3": 3,
}

mylist = [
    (1, 'hello'),
    (2, 'world'),
]

nested = {
    a: [
        (1, 'a'),
        (2, 'b'),
    ],
    b: [
        (3, 'c'),
        (4, 'd'),
    ],
}

Точно так же, вот мой предпочтительный способ включения больших строк без ввода пробелов (как если бы вы использовали многострочные строки в тройных кавычках):

data = (
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABG"
    "l0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEN"
    "xBRpFYmctaKCfwrBSCrRLuL3iEW6+EEUG8XvIVjYWNgJdhFjIX"
    "rz6pKtPB5e5rmq7tmxk+hqO34e1or0yXTGrj9sXGs1Ib73efh1"
    "AAAABJRU5ErkJggg=="
)
FogleBird
источник
Не могли бы вы включить ссылку, у меня возникли проблемы с поиском авторитетного источника по этому вопросу. (Я согласен с вами).
Труфа
82
Хм, я нашел это: stackoverflow.com/questions/6388187/…
FogleBird
6
Не говорите ему, но этот пользователь понятия не имеет, о чем говорит; P
Труфа
3
LOL, более серьезно, я также не смог найти «авторитетную» ссылку. Я дам вам знать, если я сделаю! Возможно, кто-то должен связаться с Гвидо.
FogleBird
2
Это соответствует PEP 8: python.org/dev/peps/pep-0008/#indentation . Внизу раздела об отступах есть несколько примеров.
Ams
31

Прежде всего, как сказал Стивен Румбальски: «PEP8 не решает этот вопрос», так что это вопрос личных предпочтений.

Я бы использовал подобный, но не идентичный формат, как ваш формат 3. Вот мой, и почему.

my_dictionary = { # Don't think dict(...) notation has more readability
    "key1": 1, # Indent by one press of TAB (i.e. 4 spaces)
    "key2": 2, # Same indentation scale as above
    "key3": 3, # Keep this final comma, so that future addition won't show up as 2-lines change in code diff
    } # My favorite: SAME indentation AS ABOVE, to emphasize this bracket is still part of the above code block!
the_next_line_of_code() # Otherwise the previous line would look like the begin of this part of code

bad_example = {
               "foo": "bar", # Don't do this. Unnecessary indentation wastes screen space
               "hello": "world" # Don't do this. Omitting the comma is not good.
} # You see? This line visually "joins" the next line when in a glance
the_next_line_of_code()

btw_this_is_a_function_with_long_name_or_with_lots_of_parameters(
    foo='hello world',  # So I put one parameter per line
    bar=123,  # And yeah, this extra comma here is harmless too;
              # I bet not many people knew/tried this.
              # Oh did I just show you how to write
              # multiple-line inline comment here?
              # Basically, same indentation forms a natural paragraph.
    ) # Indentation here. Same idea as the long dict case.
the_next_line_of_code()

# By the way, now you see how I prefer inline comment to document the very line.
# I think this inline style is more compact.
# Otherwise you will need extra blank line to split the comment and its code from others.

some_normal_code()

# hi this function is blah blah
some_code_need_extra_explanation()

some_normal_code()
RayLuo
источник
Мне нравится комментарий в строке. Мой первый профессор программирования (я программировал уже много лет назад) настаивал на комментариях, но так и не объяснил, почему. Вы теперь объяснили практику, которую я использовал около 20 лет.
Джошуа К
Ага, спасибо У нас схожий возраст, опыт и «пробег» с точки зрения программирования. Итак, если вы уже начали практиковать встроенные комментарии 20 лет назад (что впечатляет!), Почему вам все еще нужно объяснение своего профессора, предположительно, 10 лет назад, когда вы учились в университете? Просто любопытно. :-)
RayLuo
очень хороший вопрос :) ATARI BASIC и GWbasic практически форсировали это, будучи компиляторами на основе нисходящих потоковых линий. это то, что я принял, когда прочитал BASIC Питера Нортона (и более поздний код ASM) в бумажных журналах. Между прочим, я выучил Turbo Pascal, но уже учился на примерах в бумажных журналах и соответствовал ограничениям BASIC.
Джошуа К
PEP8 несколько решает эту проблему, поскольку рекомендует не добавлять пробел сразу после открывающей скобки, поэтому варианты 1 и 2 в OP отсутствуют.
Даниэль Серодио
9

Поскольку ваши ключи являются строками, а мы говорим о читабельности, я предпочитаю:

mydict = dict(
    key1 = 1,
    key2 = 2,
    key3 = 3,
)
dugres
источник
6
Предпочитаю не использовать пробелы при определении kwargs. c = function(a=1, b=2)более "питон"
Стив К
1

Обычно, если у вас есть большие объекты Python, их довольно сложно отформатировать. Я лично предпочитаю использовать некоторые инструменты для этого.

Вот python-beautifier - www.cleancss.com/python-beautify, который мгновенно превращает ваши данные в настраиваемый стиль.

Максимум
источник
0
dict(rank = int(lst[0]),
                grade = str(lst[1]),
                channel=str(lst[2])),
                videos = float(lst[3].replace(",", " ")),
                subscribers = float(lst[4].replace(",", "")),
                views = float(lst[5].replace(",", "")))
Гаурав Радж
источник
Это не отвечает на вопрос
Bagerard
-1

Из моего опыта с учебниками и другими вещами номер 2 всегда кажется предпочтительным, но это личный выбор предпочтений больше всего на свете.

Джейк
источник
-6

Как правило, после заключительной записи вы не включаете запятую, но Python исправит это для вас.

Джо
источник
34
Нет! Всегда добавляйте последнюю запятую, поэтому, если вы добавляете новый последний элемент, вам не нужно менять строку перед ним. Это одна из замечательных особенностей Python: практичность, а не чистота.
Нед Бэтчелдер
2
Кроме того, этот ответ не касается задаваемого вопроса.
RKD314