Por que vírgulas finais são permitidas em uma lista?

135

Estou curioso para saber por que, em Python, uma vírgula à direita em uma lista é uma sintaxe válida, e parece que o Python simplesmente a ignora:

>>> ['a','b',]
['a', 'b']

Faz sentido quando é uma tupla desde então ('a')e ('a',)existem duas coisas diferentes, mas nas listas?

Burhan Khalid
fonte
stackoverflow.com/questions/7992559/…
Ciro Santilli escreveu:
7
A vírgula final também é permitido em listas em C, C ++, Java, JavaScript, etc
Nayuki

Respostas:

223

As principais vantagens são que facilita a edição de listas com várias linhas e reduz a confusão de diferenças.

Alterando:

s = ['manny',
     'mo',
     'jack',
]

para:

s = ['manny',
     'mo',
     'jack',
     'roger',
]

envolve apenas uma alteração de uma linha no diff:

  s = ['manny',
       'mo',
       'jack',
+      'roger',
  ]

Isso supera a diferença de várias linhas mais confusa quando a vírgula à direita foi omitida:

  s = ['manny',
       'mo',
-      'jack'
+      'jack',
+      'roger'
  ]

O último diff torna mais difícil ver que apenas uma linha foi adicionada e que a outra linha não mudou o conteúdo.

Também reduz o risco de fazer isso:

s = ['manny',
     'mo',
     'jack'
     'roger'  # Added this line, but forgot to add a comma on the previous line
]

e acionando concatenação literal de cadeia implícita , produzindo em s = ['manny', 'mo', 'jackroger']vez do resultado pretendido.

Raymond Hettinger
fonte
6
Isso faz o (mais) sentido, mas eu realmente ficaria surpreso se o analisador da linguagem fosse projetado para facilitar as diferenças.
Burhan Khalid
94
@BurhanKhalid: Os designers de linguagem são programadores, e programadores fazem muitas coisas para facilitar suas vidas.
Greg Hewgill
10
@ Burhan Se você não acredita nessa explicação, que tal também é mais simples definir a gramática dessa maneira? ;) Compare List = "[" {Item ","} "]".vs.List = "[" ({Item","}Item|)"]".
Voo
23
Isso também facilita para outros programas a geração automática de código - é muito mais fácil imprimir apenas "\"item\","para cada item do que imprimir "\"item\""para cada item seguido por ","todos, exceto o último item.
Adam Rosenfield 26/03
9
@ Voo eu pensei o mesmo também, mas a última gramática tem que ser definida de qualquer maneira, porque ainda é uma lista Python válida.
Alexander Suraphel
34

É uma convenção sintática comum permitir vírgulas à direita em uma matriz, linguagens como C e Java, e o Python parece ter adotado essa convenção para sua estrutura de dados da lista. É particularmente útil ao gerar código para preencher uma lista: basta gerar uma sequência de elementos e vírgulas, não é necessário considerar o último como um caso especial que não deve conter vírgula no final.

Óscar López
fonte
30

Ajuda a eliminar um certo tipo de bug. Às vezes, é mais claro escrever listas em várias linhas. Mas, posteriormente, você pode reorganizar os itens.

l1 = [
        1,
        2,
        3,
        4,
        5
]

# Now you want to rearrange

l1 = [
        1,
        2,
        3,
        5
        4,
]

# Now you have an error

Mas se você permitir vírgulas à direita e usá-las, poderá reorganizar facilmente as linhas sem introduzir um erro.

Keith
fonte
1
Isso é legal, mas você pode evitar isso com a vírgula pendente. Eu faço isso o tempo todo quando se escreve SQL
Burhan Khalid
38
Mesmo se você anexar a vírgula a cada elemento, ainda precisará omitir a vírgula no primeiro.
22712 Greg Hewgill
Um linter deve ser capaz de entender isso, não?
viki.omega9
6

Uma tupla é diferente porque ('a')é expandida usando continuação implícita ()es como um operador de precedência, enquanto ('a',)se refere a uma tupla de comprimento 1.

Seu exemplo original teria sido tuple('a')

richo
fonte
('a'),é uma string; mas o que quero dizer é que as vírgulas finais nas tuplas são significativas, mas nas listas elas ainda não parecem ser aceitas pelo Python.
Burhan Khalid
1
Eles são descartados silenciosamente nos dois casos, mas é necessário que em uma tupla seja necessário diferenciá-lo de uma string entre parênteses.
Richo
tuple('a')provavelmente é um mau exemplo, porque em geral tuple(x)e (x,)não é a mesma coisa. tuple('ab') != ('ab',). tuple('a') == ('a',)só porque 'a'é uma cadeia de comprimento 1.
chepner
Do REPL: >>> ("a",) == ("a") False >>> ("ab",) == ("ab") False >>> ("ab", "bc",) == ("ab", "bc") True
Seraphya
1

O principal motivo é tornar o diff menos complicado. Por exemplo, você tem uma lista:

list = [
    'a',
    'b',
    'c'
]

e você deseja adicionar outro elemento a ele. Então você acabará fazendo o seguinte:

list = [
    'a',
    'b',
    'c',
    'd'
]

assim, diff mostrará que duas linhas foram alteradas, adicionando primeiro ',' de acordo com 'c' e adicionando 'd' na última linha.

Portanto, o python permite rastrear ',' no último elemento da lista, para evitar diferenças extras, o que pode causar confusão.

Nitish Chauhan
fonte