Чи технічно необхідна двокрапка в пітонних блоках?


19

Це насправді лише теоретичне запитання новачка-пітона, який хоче зрозуміти більше.

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

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

Я вважаю, що одна з причин, яку я забуваю, полягає в тому, що вони де-факто неявні: двокрапка чи ні, твердження закінчується цим рядком.

Моє запитання - яке я задаю для того, щоб дізнатись, як працює синтаксис пітона - чи є двокрапка дійсно непотрібною? Якби я змінив синтаксис пітона, щоб товста кишка більше не потрібна, щось би зламалось? Це зробило б деякі заяви неоднозначними чи неможливими?


4
Я думаю, ти не розумієш питання, а чи потрібні колонки, щоб синтаксис працював. Крім того, яка б ваша відповідь не була, вона також повинна містити пояснення.
Томаш Зато - Відновити Моніку

Можливо, чи можете ви перефразувати частини запитання, щоб я міг скористатися вашим розумінням цього питання, можливо, прикладом? Ти був би найкращим суддею, я вважаю, що я не знаю про твій намір запитати. Ви маєте на увазі це на рівні аналізатора перекладача / укладача? Дякую купу.
bhan sur

Я не знаю, як це краще сформулювати. Моє питання в принципі, якщо ви могли б змінити весь синтаксис пітона так , що він більше не потребує в товстій кишці після if, else, whileі так далі. Якби ви це зробили, чи все ж python буде мовою, якою можна користуватися без неоднозначності?
Томаш Зато - Відновіть Моніку

Зрозумів! Це питання навколо дизайнерських рішень синтаксису python . Вибачте, неправильно зрозумів. Дякую за пояснення.
bhan sur

Спекуляція. Начебто перерви рядків важче виявити інтерпретаторами / аналізаторами на практиці або вони є для читабельності. У LUA можна писати if .. then .. endодним рядком. Отже, тут у python thenзамінено дві речі a :та необхідний новий рядок. Одне з них видається зайвим.
bhan sur

Відповіді:


9

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

Оскільки це дуже гарна ідея для мовного програмування, щоб не вимагати від вас виконання програми до того моменту, як ви збираєтеся, щоб мати змогу розбирати її, двокрапка дуже потрібна. Ви можете кинути його, але вам знадобляться інші способи роз'єднати.


1
Зачекайте, ви можете мати виписку після двокрапки на тому ж рядку? Я був майже впевнений, що це не дозволено.
Томаш Зато - Відновіть Моніку

1
Це дозволено, але лише з розривом лінії після нього.
Фоши

Ще трохи розгублений. Чи це дозволено: if condition: print("Condition passed")\nдозволено? \nСимволізує новий рядок після заяви друку.
Томаш Зато - Відновіть Моніку

Звичайно, просто спробуйте.
RemcoGerlich

1
@TomasZato: так, ви можете мати будь-які заяви після двокрапки. Він негайно припиняє блок, тому в основному корисно, коли блок є невеликим вкладишем.
Лежать Раян

14

Товста кишка не є граматично необхідною, якби Python був розроблений в іншому світі, цілком можливо, що дизайнер мови може не вирішити вимагати двокрапки. І справді такі мови, як Кобра, роблять це.

Основна причина, чому потрібна товста кишка в пітоні, - це читабельність людини. Процитуйте з FAQ на Python :

Чому для операторів if / while / def / class потрібні двокрапки?

Товста кишка потрібна насамперед для підвищення читабельності (один із результатів експериментальної мови ABC). Врахуйте це:

if a == b
    print(a)

проти

if a == b:
    print(a)

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

Ще одна незначна причина полягає в тому, що двокрапка полегшує редакторів із виділенням синтаксису; вони можуть шукати колонки, щоб вирішити, коли відступ потрібно збільшити замість того, щоб робити більш детальний розбір тексту програми.

Як також було сказано у FAQ, двокрапка також полегшує обробку python-коду без повного розбору мови. Будь-який текстовий процесор, який має повноцінний аналізатор, включаючи компілятор python, може обійтися без двокрапки, якби цього не потрібно, або якщо це зробити необов’язковим, коли однозначно.


4
"Зверніть увагу, як друге трохи легше читати". Я вважаю перший легшим для читання. Менше шуму.
користувач76284

10

Це потрібно не комп’ютеру, а людині.

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

У цій публікації в блозі на тему "Карін Девар, відступ і двокрапка" Гуйдо пише:

І тут я перефразую, на прохання Ламберта.

У 1978 році на сесії дизайну в особняку в Яблоні (Польща) Роберт Девар, Пітер Кінг, Джек Шварц та Ламберт порівнювали різні альтернативні запропоновані синтаксиси для B, порівнюючи (баггі) варіанти сортування бульбашок, записані в кожній альтернативі. Оскільки вони не змогли домовитись, дружину Роберта Девара зателефонували зі своєї кімнати і попросили її думки, як сучасний Париж попросив порівняти красуню Гери, Афіни та Афродіти. Але після того, як їй було пояснено першу версію, вона зауважила: "Ви маєте на увазі в рядку, де написано:" ЗА Я ... ", що це потрібно зробити для наступних рядків, а не тільки для цього рядка? ! " І тут учені зрозуміли, що непорозуміння можна було б уникнути, якби в кінці цього рядка була двокрапка.

( B ось серія мов прототипів B0, B1, ... що призвела до ABC. Це не мова, яка є попередником C).

Я також пам’ятаю, як Гвідо в 90-х вказував, що саме на користь редакторів можна автоматично вставити відступ після рядка, який закінчується двокрапкою. Але я ще не знайшов джерела для цього.


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 це товста кишка. Якщо ви видалите товсту кишку, її потрібно замінити чимось іншим, наприклад примусовим відступом. Тільки видалення товстої кишки не вийде.

Єдиний спосіб бути абсолютно впевненим - це формалізувати синтаксис з двокрапкою та без неї та довести її неоднозначність.

Однак зауважте, що одним із афоризмів дзен Питона є "Явне краще, ніж неявне", тому явне розмежування блоків колонами, здається, відповідає загальній філософії Пітона. Дизайн і історія FAQ також згадує , що це рішення засноване на емпіричних даних від попередника Пайтона ABC.


3
Що ж, за допомогою тієї філософії, описаної в останньому абзаці, вам може знадобитися двокрапка в кінці кожного рядка. Явний vs неявний має сенс лише тоді, коли явний фактично додає інформацію (наприклад, неявний варіант неоднозначний). Що було суть мого питання.
Томаш Зато - Відновіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.