Чтобы объяснить, почему я задал этот вопрос, я объясню часто используемые многострочные записи списков / словарей в python3 и как выглядит фактическое определение синтаксиса.
Это наиболее часто используемая запись многострочного списка в python3:
list_variable = [
'value1',
'value2',
# The last comma after 'value2' is sometimes omitted.
]
И, чтобы понять, как эта нотация распознается парсером, нам нужно взглянуть на определение грамматики (ссылка).
В определении python списковые определения определены примерно так:
list_like: '[' [element (',' element)* [','] ] ']'
Позвольте мне объяснить это немного подробнее, на случай, если вы не знакомы с определением синтаксиса или я плохой составитель итогов:
'' означает, что это действительно персонаж. Например, '[' и ']' - это конец или начало списка в чистом виде, которым в реальном коде будет [ 'значение1', 'значение2', ].
element - это ожидаемые элементы их типа. например, если это список, это будет единственная переменная. Если это словарь, то это будет key ':' value.
[] означает все, что внутри не является обязательным.
() означает все, что находится внутри, в одном наборе. Т.е. все складывается вместе.
* означает предшествующий набор синтаксиса, который может встречаться 0 или более раз. В этом примере (',' element) можно не указывать, но он также может встречаться 3 раза.
Чуть не забыл упомянуть, что эти правила применяются после того, как сделано управление пробелами.
Хорошо, давайте посмотрим на пример синтаксического анализа списка:
[1]
будет проанализирован в '['element']'
[1, ]
будет '['element','']'
[1, 2]
будет '['element(',' element)']'
[1, 2, ]
будет '['element(',' element)','']'
Итак, как вы видите, в примере 3 запятая связана с 2, а не с 1.
Кроме того, в примере последняя запятая не связана с 2 - она фактически не связана ни с чем с точки зрения определения синтаксиса.
Теперь актуальный вопрос: Есть ли еще причины использовать запятую перед новой строкой, кроме того факта, что большинство языков использовали это обычно? Я думаю, что разумно использовать запятую после новой строки по следующим причинам:
Это больше похоже на фактическое определение синтаксиса.
Это гарантирует, что всегда будет точное количество запятых (количество элементов - 1), и это помогает, когда вы имеете дело с языками, которые ненавидят дополнительную запятую в начале, например SQL.
Он также удобен для git, как и запись с запятой: если вы добавите новый элемент в список, git diff покажет только + , new_element.
Фактически, в нотации запятая перед новой строкой, если кто-то забыл добавить запятую после old_element (или потому, что язык не позволяет использовать дополнительную запятую), тот, кто добавляет элемент после этого, увидит журнал git, подобный этому:
- old_element
+ old_element,
+ new_element,
@ user2357112 [1 \ n, 2] => [0 \ n, 1 \ n, 2], и он может отображать вводящий в заблуждение журнал git, если перед запятой будет [1, \ n2] => [0, \ n1, \ n2 ] и создает более чистый журнал git. Я этого не заметил. Спасибо.
Между открывающими и закрывающими скобками [ и ], определяющими последовательность, новые строки не имеют большого значения в Python, поэтому я думаю, что ваш анализ неприменим. То, что вы говорите о компоновке кода и о том, как это делается, мы надеемся, обычно следуя некоторому соглашению, например PEP 8 - Руководство по стилю кода Python. Это скорее вопрос вкуса, а не столько эффективность синтаксического анализа. Несомненно, существуют способы, которые упростят определенные модификации. Хорошо, сделай это, рекомендации - это всего лишь предложения.






(1) «Большинство» языков программирования не имеют никаких предпочтений. Программист решает, где поставить запятую. В случае, который вы цитируете, когда язык или некоторая библиотека времени выполнения сериализует некоторую структуру в текстовую строку, это вопрос предпочтения, то есть мнения. См. (2).
(2) Мне, как и некоторым другим, нравится, чтобы мои языки программирования выглядели как некоторые знакомые обозначения. В английской прозе я пишу «гонорар, враг, тьфу, фум», а не «гонорар, враг, тьфу, фум» - запятая присоединяется к первому из двух элементов, которые она разделяет, а не ко второму. Точно так же и в математике.
Что, если вы хотите что-то добавить в передний списка?