В чем принципиальный смысл двоеточия при отделение блоков кода в Python?

Рейтинг: 6Ответов: 4Опубликовано: 09.01.2023

Есть принцип DRY, то есть "не повторяйся". Когда мы пишем функцию def, используем if, for и другие инструкции, то в конце ставим двоеточие для отделения блока кода от его объявления. А на следующей строке обязательно используем отступ в 4 пробела с той же целью. Разве это не нарушение DRY? В чем тогда сакральный смысл двоеточия? Оно под капотом Python как-то обрабатывается? Разве одной табуляции было бы не достаточно?

Может вопрос и странный, но я не могу представить себе ситуацию, в которой отсутствие двоеточия сломало бы код. Если задача только визуально отделить необходимый блок кода, то с этим справляется табуляция. Поэтому есть ощущение, что я не до конца понимаю сам смысл двоеточия с точки зрения обработки кода интерпретатором

с точки зрения синтаксиса двоеточие и отступ выполняют одно у ту же функцию - отделение вложенного блока кода.

Ответы

▲ 4Принят

Обратимся к автору: двоеточие нужно для улучшения читаемости. Технической необходимости в этом действительно нет.

The colon is required primarily to enhance readability (one of the results of the experimental ABC language). Consider this:

if a == b 
    print a

versus

if a == b: 
    print a

Notice how the second one is slightly easier to read. Notice further how a colon sets off the example in the second line of this FAQ answer; it's a standard usage in English. Finally, the colon makes it easier for editors with syntax highlighting.

▲ 6

Хорошо, давайте попробуем сократить одну из "лишних" сущностей.

  • Начнём с отступа
def func():
print('Hello world!')
a = 1
b = 2
c = a + b
print(c)
func()

Так, стоп - а как понять, что функция кончилась? Придётся ещё какое-то правило вводить, например, пустую строку в конце функции.

def func():
print('Hello world!')
a = 1
b = 2
c = a + b
print(c)

func()

Хм, ну это вариант, но лучше ли это, чем отступы, нагляднее ли? А если добавить ещё таких же сущностей внутрь функции.

def func():
print('Hello world!')
a = 1
b = 2
if a > b:
c = a - b
else:
c = a + b
print(c)

func()

Так, стоп, а как понять, где кончились строки внутри блоков if?! И так, чтобы не перепутать их с концом функции? Тоже с помощью пустой строки? Ну ладно, добавим ещё после else: пустую строку.

def func():
print('Hello world!')
a = 1
b = 2
if a > b:
c = a - b
else:
c = a + b

print(c)

func()

Понятно ли в таком виде, где кончился else:, а где def? А если это длинная функция и там ещё есть внутри уровни вложенности? Это тогда придётся считать пустые строки, чтобы понять, конец какого блока эта пустая строка означает? И считать потом назад конструкции, начинающие блоки. Кажется, код постепенно становится не читаемым. :/

  • Теперь попробуем оставить отступы, но не двоеточие
def func()
    print('Hello world!')
    a = 1
    b = 2
    if a > b
        c = a - b
    else
        c = a + b
    print(c)

func()

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

if a > b c = a - b

Вы сможете сходу понять глядя на такой код где кончилось условие и где начался код внутри уже блока if? И сразу понять, глядя на этот код, нет ли тут каких ошибок? Я вот что-то уже не уверен. Если только запретить продолжать код в той же строке, тогда ещё ладно. Но всё-равно не будет чёткого видения, где же тут кончился оператор и начался блок внутри оператора.

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

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

▲ 3

Двоеточие визуально разграничивают ключевые слова и код. До двоеточия ключевое слова, а далее код.

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

А двоеточие, в отличие от отступа, делает это явно. А как известно:

Explicit is better than implicit.

▲ 0

Возможно не совсем ответ на вопрос. Но двоеточие - это признак, что на следующей строке должен быть добавлен отступ.