Кортежи с одним элементом в Python требуют запятой после запятой

Бизнес

Кортежи, которые являются неизменяемыми (неизменными) объектами последовательности в Python.

Необходимо соблюдать осторожность при генерации кортежей с одним элементом или пустых кортежей.

Здесь описаны следующие детали.

  • Кортеж с 1 элементом
  • Круглые скобки могут быть опущены.
  • Пустой кортеж
  • Кортежи в аргументах функций

Кортеж с 1 элементом

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

single_tuple_error = (0)

print(single_tuple_error)
print(type(single_tuple_error))
# 0
# <class 'int'>

Для создания кортежа с одним элементом требуется запятая.

single_tuple = (0, )

print(single_tuple)
print(type(single_tuple))
# (0,)
# <class 'tuple'>

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

# print((0, 1, 2) + (3))
# TypeError: can only concatenate tuple (not "int") to tuple

print((0, 1, 2) + (3, ))
# (0, 1, 2, 3)

Круглые скобки могут быть опущены.

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

Именно запятая создает кортеж, а не круглые скобки.
Tuples — Built-in Types — Python 3.10.4 Documentation

Даже если круглые скобки () опущены, он обрабатывается как кортеж.

t = 0, 1, 2

print(t)
print(type(t))
# (0, 1, 2)
# <class 'tuple'>

Обратите внимание, что лишняя запятая после объекта считается кортежем.

t_ = 0,

print(t_)
print(type(t_))
# (0,)
# <class 'tuple'>

Пустой кортеж

Как упоминалось выше, круглые скобки () могут быть опущены при представлении кортежа, но обязательны при генерации пустого кортежа.

Пробел или запятая приведут к ошибке синтаксиса.

empty_tuple = ()

print(empty_tuple)
print(type(empty_tuple))
# ()
# <class 'tuple'>

# empty_tuple_error = 
# SyntaxError: invalid syntax

# empty_tuple_error = ,
# SyntaxError: invalid syntax

# empty_tuple_error = (,)
# SyntaxError: invalid syntax

Пустые кортежи также могут генерироваться функцией tuple() без аргументов.

empty_tuple = tuple()

print(empty_tuple)
print(type(empty_tuple))
# ()
# <class 'tuple'>

Кортежи в аргументах функций

Круглые скобки () необходимы даже при наличии синтаксической двусмысленности.

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

Без круглых скобок () каждое значение передается каждому аргументу; со скобками () каждое значение передается как кортеж одному аргументу.

def example(a, b):
    print(a, type(a))
    print(b, type(b))

example(0, 1)
# 0 <class 'int'>
# 1 <class 'int'>

# example((0, 1))
# TypeError: example() missing 1 required positional argument: 'b'

example((0, 1), 2)
# (0, 1) <class 'tuple'>
# 2 <class 'int'>

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

example(*(0, 1))
# 0 <class 'int'>
# 1 <class 'int'>

Для получения дополнительной информации см. следующую статью.