Что такое правило синтаксиса для наличия запятых в определениях кортежей?
В случае одного кортежа элемента требуется конечная запятая.
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 - просто число.