Яке правило синтаксису для наявності знаків, що знаходяться в кодах, у корінних визначеннях?


119

У випадку кортежу з одним елементом потрібна кома в кінці.

a = ('foo',)

А що з кортежем з кількома елементами? Здається, що незалежно від того, існують чи ні, то вони є дійсними. Це правильно? На мою думку, трелінг із комою простіше для редагування. Це поганий стиль кодування?

a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)

Ось правило синтаксису: docs.python.org/reference/expressions.html#expression-lists
— Кирилл

Відповіді:


73

У всіх випадках, крім порожнього кортежу, важлива річ. Дужки потрібні лише тоді, коли це потрібно з інших синтаксичних причин: щоб відрізнити кортеж від набору аргументів функції, пріоритету оператора або дозволити розриви рядків.

Концева кома для кортежів, списків або аргументів функції є гарним стилем, особливо коли у вас є тривала ініціалізація, яка розділена на кілька рядків. Якщо ви завжди включаєте коду в кінці, ви не додасте інший рядок до кінця, очікуючи додати ще один елемент, а натомість просто створіть дійсний вираз:

a = [
   "a",
   "b"
   "c"
]

Якщо припустити, що почався як список двох елементів, який згодом було розширено, він помилився, мабуть, не відразу очевидним чином. Завжди включайте коду в кінці, і ви уникаєте цієї пастки.


3
З причин, зазначених вище, залишати кому може бути вигідним. З іншого боку, прийняття цієї звички може призвести до головних болів, якщо ви також маєте справу з JavaScript або JSON в іншому місці вашої програми, оскільки деяким браузерам це не подобається.
— Cito

7
Так, але ви ніколи не повинні створювати JSON вручну, щоб це не мало значення, а для Javascript завжди використовуйте jslint або еквівалент, щоб знайти цю помилку, перш ніж вона наблизиться до браузера.
— Дункан

100

Потрібно лише, щоб однорядкові кортежі розмежовували, визначаючи кортеж або вираз, оточений дужками.

(1)  # the number 1 (the parentheses are wrapping the expression `1`)
(1,) # a 1-tuple holding a number 1

Для більш ніж одного предмета це більше не потрібно, оскільки цілком зрозуміло, що це кортеж. Однак, кома в кінці може полегшувати їх визначення за допомогою декількох рядків. Ви можете додати до кінця або переставити елементи, не порушуючи синтаксис, оскільки випадково випустили кому.

наприклад,

someBigTuple = (
                   0,
                   1,
                   2,
                   3,
                   4,
                   5,
                   6,
                   7,
                   8,
                   9,
                   10,
                   #...
                   10000000000,
               )

Зауважте, що це стосується й інших колекцій (наприклад, списків та словників), а не лише кортежів.


5
+1, щоб вказати, що це також стосується інших речей, ніж кортежі. Це настільки корисно, щоб мати один key: value,рядок на рядок, а не доглядати за комою при додаванні нових матеріалів.
— Joël

46

Ще одна перевага зачіпних коми - це те, що вони виглядають приємніше. Якщо ви почали з

a = [
    1,
    2,
    3
]

і змінив його на

a = [
    1,
    2,
    3,
    4
]

Різниця виглядала б так

 a = [
     1,
     2,
-    3
+    3,
+    4
 ]

Тоді якби ви починали з кінцевої коми, наприклад

a = [
    1,
    2,
    3,
]

Тоді різниця була б просто

 a = [
     1,
     2,
     3,
+    4,
 ]

Це дійсно скоріше коментар, ніж відповідь на початкове запитання, але мені дуже подобається доданий аргумент на користь задніх коми.
— Божевільний фізик

13

Це необов'язково: див. Вікі Python .

Короткий зміст: одноелементним кортежам потрібна кодова коска , але для кортенів з декількома елементами це необов'язково .


8

Також врахуйте ситуацію, коли вам потрібно:

>>> (('x','y'))*4                         # same as ('x','y')*4
('x', 'y', 'x', 'y', 'x', 'y', 'x', 'y')
#Expected = (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

Тож у цьому випадку зовнішні дужки є не що інше, як групування дужок. Щоб зробити їх кортежем, вам потрібно додати кінцеву кому. тобто

>>> (('x','y'),)*4 
(('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

6

Послідовна кома потрібна лише для одноелементних кортежів. Наявність тремової коми через більші кортежі - це питання стилю і не потрібно. Найбільша його перевага - чистий розріз у файлах із багаторядковими великими кортежами, які часто змінюються (наприклад, кортежі конфігурації).


6

Це проста відповідь.

a = ("s") - рядок

і

a = ("s",) - кортеж з одним елементом.

Python потребує додаткової коми у випадку, якщо один елемент кортежить, щоб розрізняти рядок і кортеж.

Наприклад, спробуйте це на консолі python:

a = ("s")

a = a + (1,2,3)

Traceback (останній останній дзвінок):

Файл stdin, рядок 1, в модулі

TypeError: не може об'єднати об'єкти 'str' та 'tuple'


4

Ще одна причина, що це існує, полягає в тому, що це спрощує створення коду та __repr__функції простішого запису. Наприклад, якщо у вас є якийсь об'єкт, який побудований як obj(arg1, arg2, ..., argn), ви можете просто написати obj.__repr__як

def __repr__(self):
    l = ['obj(']
    for arg in obj.args: # Suppose obj.args == (arg1, arg2, ..., argn)
        l.append(repr(arg))
        l.append(', ')
    l.append(')')
    return ''.join(l)

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


2
Там не було б ніякої необхідності спеціального випадку останній аргумент, можна використовувати тільки joinв тому випадку: def __repr__(self): 'obj(' + ', '.join([repr(arg) for arg in obj.args]) + ')'.
— Сюзанна Дуперон

Це також допомагає при генерації коду, навіть з інструментів, які не написані на Python і не мають таких приємних функцій join.
— asmeurer

2

PEP 8 - Посібник зі стилю коду Python - Коли використовувати кінцеві коми

Зворотні коми зазвичай не є обов'язковими, за винятком того, що вони є обов'язковими при складанні кортежу з одного елемента (а в Python 2 вони мають семантику для оператора друку). Для наочності рекомендується оточити останніх у (технічно зайвих) дужках.

Так:

FILES = ('setup.cfg',)

Гаразд, але заплутано:

FILES = 'setup.cfg',

Коли пропуски коми надмірні, вони часто корисні, коли використовується система контролю версій, коли очікується, що список значень, аргументів або імпортованих елементів буде з часом розширений. Шаблон полягає в тому, щоб поставити кожне значення (тощо) на рядок самостійно, завжди додаючи коду в кінці, а в наступному рядку додати близьку дужку / дужку / дужку. Однак не має сенсу мати кінцеву кому на тій самій лінії, що і розділовий замикач (за винятком вищезазначеного випадку кортежів одномісних).

Так:

FILES = [
    'setup.cfg',
    'tox.ini',
    ]
initialize(FILES,
           error=True,
           )

Немає:

FILES = ['setup.cfg', 'tox.ini',]
initialize(FILES, error=True,)

-5

Стиль кодування - це ваш смак. Якщо ви думаєте, що стандарт кодування має значення PEP-8, який може вас керувати.

Що ви думаєте про результат наступного вираження?

x = (3)
x = (3+2)
x = 2*(3+2)

Так, x - це просто число.


1
це поганий спосіб пояснення своєї думки. Явне краще, ніж неявне.
— Гільхерм Девід да Коста
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.