Является ли двоеточие в блоках python технически необходимым?

19

Это действительно теоретический вопрос новичка-питона, который хочет понять больше.

Я продолжаю забывать двоеточие после блока начальных операторов в python. Вот что я имею в виду:

  • for <variable> in <sequence>:
  • if <blah blah>:

Я думаю, что одна из причин, которые я продолжаю подделывать, состоит в том, что они де-факто неявны: двоеточие или нет, утверждение заканчивается на этой строке.

Мой вопрос - который я задаю, чтобы узнать, как работает синтаксис Python, - действительно ли двоеточие не нужно? Если бы я изменил синтаксис python, чтобы двоеточие больше не было нужно, что-нибудь сломалось бы? Это сделало бы некоторые заявления двусмысленными или невозможными?

Томаш Зато - Восстановить Монику
источник
4
Я думаю, вы не понимаете вопрос: нужны ли двоеточия для работы синтаксиса. Кроме того, независимо от того, каков ваш ответ, он также должен содержать объяснение.
Томаш Зато - Восстановить Монику
Возможно, вы можете перефразировать части вопроса, чтобы я мог извлечь пользу из вашего понимания этого вопроса, может быть, пример? Ты будешь лучшим судьей, я думаю, я не в курсе твоего намерения спросить. Вы имеете в виду это на уровне парсера интерпретатора / компилятора? Огромное спасибо.
Бхан-сюр-
Я не знаю, как это лучше выразить. Мой вопрос в принципе, если вы могли бы изменить весь синтаксис питона так , что он больше не нуждается в толстой кишке после if, else, whileи так далее. Если бы вы сделали это, станет ли python языком, который можно использовать без двусмысленности?
Томаш Зато - Восстановить Монику
Понял! Это вопрос вокруг дизайна синтаксис языка Python решений . Извините, неправильно понял. Спасибо за объяснение.
Бхан-сюр-
Рассуждая. Это как если бы разрывы строк было труднее обнаружить интерпретаторам / парсерам на практике или они были удобочитаемы. В LUA вы можете написать if .. then .. endв одну строку. Таким образом, здесь в python thenзаменены две вещи :и обязательный перевод строки. Один из них кажется излишним.
Бхан-сюр-

Ответы:

9

Да, двоеточие требуется для устранения неоднозначности определенных конструкций. Рассмотрим, к примеру if x - y < z: pass,. Без двоеточия мы не можем решить, как разобрать это, не зная контекста того, что такое x, y и z. if x: -y < z...действителен, если x является логическим значением, if x - y < z:действителен в противном случае.

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

Phoshi
источник
1
Подождите, вы можете иметь оператор после двоеточия на той же строке? Я был уверен, что это запрещено.
Томаш Зато - Восстановить Монику
1
Это разрешено, но только с переводом строки после него.
Фоши
Все еще немного смущен. Это разрешено: if condition: print("Condition passed")\nразрешено? \nСимволизирует новую строку после заявления печати.
Томаш Зато - Восстановить Монику
Конечно, просто попробуйте.
RemcoGerlich
1
@ TomasZato: да, вы можете иметь любые заявления после двоеточия. Он немедленно завершает блок, поэтому он полезен, когда блок имеет небольшой вкладыш.
Ли Райан
14

Двоеточие на самом деле не нужно грамматически, если бы Python был разработан в другом мире, вполне возможно, что разработчик языка не решит потребовать двоеточие. И действительно, такие языки, как Cobra, делают это.

Основная причина, почему двоеточие требуется в python, - читаемость человеком. Цитировать из Python FAQ :

Почему двоеточия требуются для операторов if / while / def / class?

Двоеточие требуется прежде всего для улучшения читабельности (один из результатов экспериментального языка ABC). Учти это:

if a == b
    print(a)

против

if a == b:
    print(a)

Обратите внимание, что второй текст немного легче читать. Далее обратите внимание на то, как двоеточие приводит пример в этом ответе на часто задаваемые вопросы; это стандартное использование на английском языке.

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

Как также упоминалось в FAQ, двоеточие также облегчает обработку кода Python без полного синтаксического анализа языка. Любой текстовый процессор, имеющий полноценный парсер, включая компилятор python, может обойтись без двоеточия, если это не требуется или если он сделан необязательным, когда однозначно.

Ли Райан
источник
3
«Заметьте, что второй текст легче читать». Первый текст мне легче читать. Меньше шума
user76284
10

Это не обязательно для компьютера, но для людей.

Гвидо ван Россум (создатель Python) некоторое время вел блог истории Python. Двоеточие было введено в ABC , источнике многих возможностей Python.

В этом сообщении в блоге «Карин Дьюар, Отступ и Колон» Гвидо пишет:

И здесь я перефразирую, по просьбе Ламберта.

В 1978 году на сессии дизайна в особняке в Яблонне (Польша) Роберт Дьюар, Питер Кинг, Джек Шварц и Ламберт сравнивали различные альтернативные предлагаемые синтаксисы для B, сравнивая (глючные) реализации пузырьковой сортировки, записанные в каждой альтернативе. Поскольку они не могли договориться, жену Роберта Дьюара вызвали из ее комнаты и спросили ее мнение, как современный Париж попросил сравнить красоту Геры, Афины и Афродиты. Но после того, как ей была объяснена первая версия, она заметила: «Вы имеете в виду, в строке, где говорится:« ДЛЯ меня ... », что это должно быть сделано для последующих строк, а не только для этой строки? !» И здесь ученые поняли, что недопонимания можно было бы избежать, если бы в конце этой строки была толстая кишка.

( B - это серия языков-прототипов B0, B1, ..., которые привели к ABC. Это не язык B, который является предшественником C).

Я также помню, как Гвидо в 90-х годах указывал, что это было на пользу редакторам , которые могут автоматически вставлять отступ после строки, заканчивающейся двоеточием. Но я еще не нашел источник для этого.

RemcoGerlich
источник
4

Cobra Язык программирования «s синтаксис сильно вдохновлен языка Python, и это делает прочь с двоеточием, так что кажется , что это не является строго необходимым. Тем не менее, недостаточно просто удалить двоеточие, необходимы другие изменения в синтаксисе. Посмотрите, например, этот кусок кода из одного из моих игрушечных проектов :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

Без двоеточия, чтобы отделить тело от списка параметров, мне пришлось бы использовать отступ:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Я полагаю, что более ранние версии Cobra делали двоеточие необязательным, вы можете использовать отступ или двоеточие или оба. Аналогично тому, как это работает в Ruby, где есть ключевые слова для разделения различных частей управляющих выражений, но вы также можете использовать разделители выражений (точка с запятой или новая строка):

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

В текущих версиях Cobra вы можете использовать запятую:

if x
    y

можно записать как

if x, y

Вам нужен какой-то способ разделения различных частей управляющих выражений или определений. В Python это двоеточие. Если вы удалите двоеточие, вам нужно заменить его чем-то другим, например, принудительным отступом. Только удаление толстой кишки не сработает.

Единственный способ быть абсолютно уверенным - это формализовать синтаксис с двоеточием и без него и доказать его не двусмысленность.

Обратите внимание, однако, что один из афоризмов дзен Python - «Явное лучше, чем неявное», поэтому явное разграничение блоков с двоеточиями, кажется, соответствует общей философии Python. В FAQ по дизайну и истории также упоминается, что это решение основано на эмпирических данных предшественника Python, ABC.

Йорг Миттаг
источник
3
Ну, с этой философией, описанной в последнем параграфе, вам может потребоваться двоеточие в конце каждой строки. Явное против неявного имеет смысл, только если явное добавление информации (например, неявный вариант неоднозначен). Какой был смысл моего вопроса.
Томаш Зато - Восстановить Монику