Что такое правило синтаксиса для наличия запятых в определениях кортежей?

В случае одного кортежа элемента требуется конечная запятая.

a = ('foo',)

Как насчет кортежа с несколькими элементами? Кажется, что существуют ли конечные запятые или нет, они оба действительны. Это верно? С моей точки зрения, редактирование запятой проще для редактирования. Это плохой стиль кодирования?

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

Ответ 1

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

Запятая запятая для кортежей, списков или аргументов функции - хороший стиль, особенно если у вас длинная инициализация, разделенная на несколько строк. Если вы всегда включаете конечную запятую, то вы не добавите еще одну строку до конца, ожидая добавить другой элемент, а вместо этого просто создадите правильное выражение:

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

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

Ответ 2

Требуется только для одноуровневых кортежей, чтобы однозначно определить кортеж или выражение, окруженное скобками.

(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,
               )

Обратите внимание, что это относится и к другим коллекциям (например, спискам и словарям), а не только к кортежам.

Ответ 3

Еще одно преимущество концевых запятых состоит в том, что он делает различия более приятными. Если вы начали с

a = [
    1,
    2,
    3
]

и изменил его на

a = [
    1,
    2,
    3,
    4
]

Разница будет выглядеть как

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

Если вы начали с запятой, например

a = [
    1,
    2,
    3,
]

Тогда diff будет просто

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

Ответ 4

Это необязательно: см. Python wiki.

Сводка: одноэлементные кортежи нуждаются в концевой запятой, но необязательно для многоэлементных кортежей.

Ответ 5

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

Ответ 6

Другая причина, по которой это существует, заключается в том, что упрощает запись генерации кода и функций __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)

Если конечная запятая не была разрешена, у вас должен быть специальный аргумент последнего аргумента. Фактически, вы могли бы написать выше в одной строке, используя понимание списка (я написал его дольше, чтобы упростить его чтение). Было бы не так легко сделать это, если бы у вас был специальный случай с последним термином.

Ответ 7

Это простой ответ.

a = ( "s" ) - строка

и

a = ( "s" ,) является кортежем с одним элементом.

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

Например, попробуйте это на консоли python:

a = ( "s" )

a = a + (1,2,3)

Traceback (последний последний вызов):

Файл stdin, строка 1, в модуле

TypeError: не может конкатенировать объекты 'str' и 'tuple'

Ответ 8

Стиль кодирования - это ваш вкус. Если вы считаете, что стандартное кодирование имеет значение PEP-8, это может вам помочь.

Что вы думаете о результате следующего выражения?

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

Yep, x - просто число.