Tuplos com um único elemento em Python requerem uma vírgula de fuga

O negócio

Tuples, que são objectos de sequência imutáveis (imutáveis) em Python.

Deve ter-se cuidado ao gerar tufos com um único elemento ou tufos vazios.

Os seguintes detalhes são descritos aqui.

  • Tuple com 1 elemento
  • Podem ser omitidos os parênteses redondos de tremoços.
  • Tuple vazia
  • Túplos em argumentos funcionais

Tuple com 1 elemento

Se tentar gerar um tuple com um elemento e escrever apenas um objecto dentro dos parênteses (), os parênteses () serão ignorados e processados e não serão considerados um tuple.

single_tuple_error = (0)

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

É necessária uma vírgula para gerar um tuple com um elemento.

single_tuple = (0, )

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

Por exemplo, ao utilizar o operador + para concatenar múltiplos tuplos, note que se tentar adicionar um elemento e esquecer uma vírgula, obterá um erro.

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

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

Podem ser omitidos os parênteses redondos de tremoços.

A razão pela qual um tuple com um elemento precisa de uma vírgula é porque um tuple não é um valor entre parênteses () mas sim um valor separado por uma vírgula.

É a vírgula que cria o tuple, não os parênteses redondos.
Tuples — Built-in Types — Python 3.10.4 Documentation

Mesmo que os parênteses redondos () sejam omitidos, é processado como um tuple.

t = 0, 1, 2

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

Note-se que uma vírgula desnecessária depois de um objecto é considerada um tuple.

t_ = 0,

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

Tuple vazia

Como mencionado acima, os parênteses redondos () podem ser omitidos quando se representa um tuple, mas são necessários quando se gera um tuple vazio.

Só um espaço ou vírgula resultará numa SyntaxError.

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

Tupilos vazios também podem ser gerados por tuple() sem argumentos.

empty_tuple = tuple()

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

Túplos em argumentos funcionais

Os parênteses redondos () são necessários mesmo quando existe uma ambiguidade sintáctica.

Os argumentos da função são separados por vírgulas, mas neste caso, é necessário indicar explicitamente se a função é um tuple ou não pela presença ou ausência de parênteses redondos ().

Sem parênteses (), cada valor é passado para cada argumento; com parênteses (), cada valor é passado como um tuple para um argumento.

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'>

Se o tuple for marcado com um asterisco *, os elementos do tuple podem ser expandidos e passados como argumentos.

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

Para mais informações, ver o artigo seguinte.

Copied title and URL