Pourquoi les virgules de fin sont-elles autorisées dans une liste?

135

Je suis curieux de savoir pourquoi en Python, une virgule de fin dans une liste est une syntaxe valide, et il semble que Python l'ignore simplement:

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

Cela a du sens quand c'est un tuple depuis ('a')et qu'il ('a',)y a deux choses différentes, mais dans des listes?

Burhan Khalid
la source
stackoverflow.com/questions/7992559/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
7
Une virgule à la fin est également autorisée dans les listes en C, C ++, Java, JavaScript, etc.
Nayuki

Réponses:

223

Les principaux avantages sont qu'il facilite la modification des listes multilignes et réduit l'encombrement des différences.

En changeant:

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

à:

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

n'implique qu'un changement d'une ligne dans le diff:

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

Cela bat le différentiel multiligne plus déroutant lorsque la virgule de fin a été omise:

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

Cette dernière différence rend plus difficile de voir qu'une seule ligne a été ajoutée et que l'autre ligne n'a pas changé de contenu.

Cela réduit également le risque de faire cela:

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

et déclencher une concaténation littérale de chaîne implicite , produisant s = ['manny', 'mo', 'jackroger']au lieu du résultat prévu.

Raymond Hettinger
la source
6
Cela a (le plus) sens, mais je serais vraiment surpris si l'analyseur du langage était conçu pour faciliter les différences.
Burhan Khalid
94
@BurhanKhalid: Les concepteurs de langage sont des programmeurs et les programmeurs font beaucoup de choses pour leur faciliter la vie.
Greg Hewgill
10
@Burhan Si vous ne croyez pas à cette explication, pourquoi est-il aussi plus simple de définir la grammaire de cette façon? ;) Compare List = "[" {Item ","} "]".vs.List = "[" ({Item","}Item|)"]".
Voo
23
Cela facilite également la génération automatique de code par d'autres programmes - il est beaucoup plus facile d'imprimer simplement "\"item\","pour chaque élément que d'imprimer "\"item\""pour chaque élément suivi de ","pour tous sauf le dernier élément.
Adam Rosenfield
9
@Voo J'ai pensé la même chose mais cette dernière grammaire doit quand même être définie car c'est toujours une liste Python valide.
Alexander Suraphel
34

C'est une convention syntaxique courante d'autoriser les virgules de fin dans un tableau, des langages comme C et Java le permettent, et Python semble avoir adopté cette convention pour sa structure de données de liste. C'est particulièrement utile lors de la génération de code pour remplir une liste: il suffit de générer une séquence d'éléments et de virgules, pas besoin de considérer le dernier comme un cas particulier qui ne devrait pas avoir de virgule à la fin.

Óscar López
la source
30

Cela aide à éliminer un certain type de bogue. Il est parfois plus clair d'écrire des listes sur plusieurs lignes. Mais lors d'une maintenance ultérieure, vous souhaiterez peut-être réorganiser les éléments.

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

# Now you want to rearrange

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

# Now you have an error

Mais si vous autorisez les virgules de fin et que vous les utilisez, vous pouvez facilement réorganiser les lignes sans introduire d'erreur.

Keith
la source
1
C'est bien, mais vous pouvez éviter cela en pré-attendant la virgule. Je fais ça tout le temps en écrivant du SQL
Burhan Khalid
38
Même si vous ajoutez la virgule à chaque élément, vous devez quand même omettre la virgule sur le premier.
Greg Hewgill
Un linter devrait pouvoir attraper ça, non?
viki.omega9
6

Un tuple est différent car il ('a')est développé en utilisant la continuation implicite et ()s comme opérateur de précendance, alors que ('a',)fait référence à un tuple de longueur 1.

Votre exemple original aurait été tuple('a')

richo
la source
('a'),est une chaîne; mais mon point était que les virgules de fin dans les tuples sont significatives, mais dans les listes, elles ne semblent pas encore être Python les accepte.
Burhan Khalid
1
Ils sont supprimés en silence dans les deux cas, c'est juste que dans un tuple, il est nécessaire de le différencier d'une chaîne entre crochets.
richo
tuple('a')est probablement un mauvais exemple, car en général tuple(x)et (x,)ne sont pas la même chose. tuple('ab') != ('ab',). tuple('a') == ('a',)seulement parce que 'a'c'est une chaîne de longueur 1.
chepner
De la REPL: >>> ("a",) == ("a") False >>> ("ab",) == ("ab") False >>> ("ab", "bc",) == ("ab", "bc") True
Seraphya
1

La raison principale est de rendre les différences moins compliquées. Par exemple, vous avez une liste:

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

et vous souhaitez y ajouter un autre élément. Ensuite, vous finirez par faire ceci:

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

ainsi, diff montrera que deux lignes ont été modifiées, en ajoutant d'abord ',' en ligne avec 'c' et en ajoutant 'd' à la dernière ligne.

Ainsi, python autorise la fin de ',' dans le dernier élément de la liste, pour éviter des différences supplémentaires qui peuvent prêter à confusion.

Nitish Chauhan
la source