Почему в списке разрешены конечные запятые?


мне любопытно, почему в Python конечная запятая в списке является допустимым синтаксисом, и кажется, что Python просто игнорирует его:

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

имеет смысл, когда его кортеж с ('a') и ('a',) это две разные вещи, но в списках?

5 86

5 ответов:

основные преимущества заключаются в том, что он упрощает редактирование многострочных списков и уменьшает беспорядок в различиях.

изменения:

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

to:

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

включает в себя только одну строку изменения в diff:

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

это бьет более запутанный многострочный diff, когда конечная запятая была опущена:

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

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

это также снижает риск сделать это:

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

и пусковым неявная конкатенация строковых литералов, производства s = ['manny', 'mo', 'jackroger'] вместо предполагаемого результата.

Это общее синтаксическое соглашение, позволяющее завершать запятые в массиве, языки, такие как C и Java, позволяют это, и Python, похоже, принял это Соглашение для своей структуры данных списка. Это особенно полезно при создании кода для заполнения списка: просто создайте последовательность элементов и запятых, не нужно рассматривать последний как особый случай, который не должен иметь запятую в конце.

это помогает устранить определенный вид ошибки. Иногда яснее писать списки на нескольких строках. Но в дальнейшем maintenace вы можете изменить порядок элементов.

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

# Now you want to rearrange

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

# Now you have an error

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

кортеж отличается тем, что ('a') расширяется с помощью неявного продолжения и ()с оператором приоритет, в то время как ('a',) относится к кортежу длиной 1.

ваш оригинальный пример был бы tuple('a')

основная причина состоит в том, чтобы сделать diff менее сложным. Например, у вас есть список :

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

и вы хотите добавить еще один элемент к нему. Тогда вы будете в конечном итоге делают это:

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

таким образом, diff покажет, что две строки были изменены, сначала добавив', ' в строке с 'и добавив' d 'в последней строке.

таким образом, python позволяет трейлинг', ' в последнем элементе списка, чтобы предотвратить дополнительные различия, которые могут вызвать путаницу.