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

Чтобы объяснить, почему я задал этот вопрос, я объясню часто используемые многострочные записи списков / словарей в python3 и как выглядит фактическое определение синтаксиса.

Это наиболее часто используемая запись многострочного списка в python3:

list_variable = [
    'value1',
    'value2',
    # The last comma after 'value2' is sometimes omitted.
]

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

В определении python списковые определения определены примерно так:

list_like: '[' [element (',' element)* [','] ] ']'

Позвольте мне объяснить это немного подробнее, на случай, если вы не знакомы с определением синтаксиса или я плохой составитель итогов:

  1. '' означает, что это действительно персонаж. Например, '[' и ']' - это конец или начало списка в чистом виде, которым в реальном коде будет [ 'значение1', 'значение2', ].

  2. element - это ожидаемые элементы их типа. например, если это список, это будет единственная переменная. Если это словарь, то это будет key ':' value.

  3. [] означает все, что внутри не является обязательным.

  4. () означает все, что находится внутри, в одном наборе. Т.е. все складывается вместе.

  5. * означает предшествующий набор синтаксиса, который может встречаться 0 или более раз. В этом примере (',' element) можно не указывать, но он также может встречаться 3 раза.

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


Хорошо, давайте посмотрим на пример синтаксического анализа списка:

  1. [1]

    будет проанализирован в '['element']'

  2. [1, ]

    будет '['element','']'

  3. [1, 2]

    будет '['element(',' element)']'

  4. [1, 2, ]

    будет '['element(',' element)','']'

Итак, как вы видите, в примере 3 запятая связана с 2, а не с 1. Кроме того, в примере последняя запятая не связана с 2 - она ​​фактически не связана ни с чем с точки зрения определения синтаксиса.


Теперь актуальный вопрос: Есть ли еще причины использовать запятую перед новой строкой, кроме того факта, что большинство языков использовали это обычно? Я думаю, что разумно использовать запятую после новой строки по следующим причинам:

  1. Это больше похоже на фактическое определение синтаксиса.

  2. Это гарантирует, что всегда будет точное количество запятых (количество элементов - 1), и это помогает, когда вы имеете дело с языками, которые ненавидят дополнительную запятую в начале, например SQL.

  3. Он также удобен для git, как и запись с запятой: если вы добавите новый элемент в список, git diff покажет только + , new_element.

    Фактически, в нотации запятая перед новой строкой, если кто-то забыл добавить запятую после old_element (или потому, что язык не позволяет использовать дополнительную запятую), тот, кто добавляет элемент после этого, увидит журнал git, подобный этому:

- old_element
+ old_element,
+ new_element,

Что, если вы хотите что-то добавить в передний списка?

user2357112 supports Monica 11.11.2018 07:11

@ user2357112 [1 \ n, 2] => [0 \ n, 1 \ n, 2], и он может отображать вводящий в заблуждение журнал git, если перед запятой будет [1, \ n2] => [0, \ n1, \ n2 ] и создает более чистый журнал git. Я этого не заметил. Спасибо.

ik1ne 11.11.2018 07:18

Между открывающими и закрывающими скобками [ и ], определяющими последовательность, новые строки не имеют большого значения в Python, поэтому я думаю, что ваш анализ неприменим. То, что вы говорите о компоновке кода и о том, как это делается, мы надеемся, обычно следуя некоторому соглашению, например PEP 8 - Руководство по стилю кода Python. Это скорее вопрос вкуса, а не столько эффективность синтаксического анализа. Несомненно, существуют способы, которые упростят определенные модификации. Хорошо, сделай это, рекомендации - это всего лишь предложения.

martineau 11.11.2018 08:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
142
1

Ответы 1

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

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

Другие вопросы по теме