Який правильний спосіб відформатувати багаторядковий dict у 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.
Sven Marnach

3
Хочу сказати, що в модулі pprint pythons він використовує ваш перший приклад, без пробілів безпосередньо всередині брекетів.
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=="
)

Чи можете ви включити якусь посилання, у мене виникають проблеми з пошуку авторитетного джерела щодо цього. (Я з вами згоден).
Труфа

82
Хм, я знайшов це: stackoverflow.com/questions/6388187 / ...
FogleBird

6
Не кажіть йому, але той користувач не має поняття, про що він говорить; P
Trufa

3
хай, більш серйозно, я також не міг знайти "авторитетного" посилання. Я дам вам знати, якщо мені це зробити! Можливо, хтось повинен зв’язатися з Гвідо.
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()

Мені подобається коментар у рядку. мій перший професор програмування (я вже займався програмуванням роками раніше) наполягав на вбудованих коментарях, але ніколи ефективно не пояснював, чому. Ви зараз пояснили практику, якою я користувався близько 20 років.
Джошуа К

Ага, дякую. У нас схожий вік, досвід та "пробіг" з точки зору програмування. Тож якщо ви вже розпочали цю практику практичних коментарів 20 років тому (що вражає!), Навіщо вам все-таки потрібні пояснення вашого професора, імовірно, 10 років тому, коли ви були у вашому університеті? Просто цікаво. :-)
RayLuo

дуже хороше запитання :) ATARI BASIC і GWbasic практично змусили це, будучи компіляторами на основі потокової лінії вниз. це щось, що я прийняв, коли я читав ОСНОВУ (а пізніше ASM-код) Пітера Нортона в паперових журналах. Я навчився Турбо Паскаля між ними, але я вже навчився на прикладах у паперових журналах і відповідав обмеженням BASIC.
Джошуа К

PEP8 дещо вирішує цю проблему, оскільки рекомендує не додавати пробіл відразу після відкриття дужки, тому варіанти 1 і 2 в ОП вичерпані.
Даніель Серодіо

9

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

mydict = dict(
    key1 = 1,
    key2 = 2,
    key3 = 3,
)

6
Віддайте перевагу не використовувати пробіли при визначенні кваргів. 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.