Conforme observado no HOWTO de Programação Funcional , para criar uma lista de tuplas usando compreensão de lista, parênteses devem ser usados. Particularmente, isso é expresso no documento na citação a seguir.
Para evitar a introdução de uma ambiguidade na gramática do Python, se a expressão estiver criando uma tupla, ela deverá estar entre parênteses.
Então, como exemplos:
[x, y for x in seq1 for y in seq2] # This is a syntex error
[(x, y) for x in seq1 for y in seq2] # This is a correct expression of list of tuples using list comprehension
Que ambiguidade é evitada ao forçar o uso de parênteses na expressão de uma lista de tuplas usando compreensão de lista?
python
python-3.x
Isaac To
fonte
fonte
Respostas:
Depois de muita pesquisa na lista de e-mails, encontrei uma declaração bastante inequívoca de que o analisador estava bem com isso. Os parênteses foram tornados obrigatórios para tornar o significado mais claro. Aqui está uma citação de Guido em 2000 na lista de discussão python-dev:
Veja também a próxima resposta no tópico, onde Greg Ewing é executado
em uma versão anterior do patch de compreensão da lista e funciona muito bem.
fonte
Dos documentos :
Dentro de uma lista, as tuplas de compreensão são aninhadas dentro de uma lista. Portanto, eles devem estar entre parênteses. Mas quando não estão sendo aninhados, por exemplo,
the_tuples = 'a','b','c'
eles não são necessários porque são automaticamente reconhecidos como tuplas.fonte
O Python possui vários elementos sintáticos com parênteses opcionais. Nesse caso, são eles:
tuple
literalx, y
y for x in seq1 for y in seq2
Em casos inequívocos, eles podem ser usados sem parênteses adicionais:
b = x, y
sum(y for x in seq1 for y in seq2)
No entanto, o uso de ambos na mesma expressão é ambíguo. Parênteses são necessários para esclarecer o significado:
[(x, y) for x in seq1 for y in seq2]
[x, (y for x in seq1 for y in seq2)]
De acordo com a gramática Python3, lista apresenta
[...]
são definidos como contendo quer uma lista de expressão (a, b, *c, d
) ou uma compreensão (a for a in b
).fonte