Если вы хотите понять , почему это происходит, а не просто изучить обходной путь, который работает по какой-то таинственной причине:
Интерактивный режим работает путем чтения, компиляции и выполнения одного оператора за раз. Это очень простое правило - помимо того, что его очень просто реализовать в коде на C, также очень просто работать точно в вашей голове - как только вы это поймете, то есть. Когда у вас есть выбор между реализацией, которую легко объяснить, документировать и проработать в своей голове, или реализацией, которая более сложна, но иногда проще в использовании, Python обычно идет с первой.
Если вы введете простой однострочный оператор, это легко: строка является полным оператором, поэтому она просто компилирует и выполняет эту строку.
Но если вы введете первую строку составного оператора - тот, который имеет :
в конце строки, а затем блок с отступом - оператор не будет выполнен, пока вы не напишите блок с отступом, а затем снова не отступите , Таким образом, он печатает специальное приглашение ...
вместо >>>
, чтобы сообщить вам, что оно продолжает читать то же самое утверждение, и продолжается до тех пор, пока вы не удалите его.
Если вы удалите отступ, набрав пустую строку, оператор готов, поэтому он компилирует и выполняет его, и все хорошо.
Если вы удалили отступ, введя новый однострочный оператор, теперь он имеет два оператора. Если он попытается скомпилировать и запустить его как один оператор, это не удастся.
Кстати, в этом def
нет ничего волшебного; то же самое произойдет с любым составным оператором:
>>> for i in range(10):
... print(i)
... print('Done')
Вы получите то же самое SyntaxError
.
Не мог ли Python выяснить, что вы дали ему два оператора, скомпилировать и запускать их один за другим? Да. На самом деле, если вы используете IPython / Jupyter, он действительно делает именно это. Но это усложнит правило, не говоря уже о таких вещах, как обработка исключений в первом утверждении. Python выбирает простое правило, которое вы можете проследить в голове над сложным правилом, хотя сложное правило будет делать то, что вы хотите чаще.
Итак, как это работает в файле модуля? Ну, модули не скомпилированы оператор за один раз, они скомпилированы все сразу, как список операторов, а затем запускаются все сразу. Это, очевидно, не работает для интерактивного терминала, потому что он не может ничего запустить, пока не скомпилирует все, и у него не будет всего, пока не выйдет время.
И последнее: почему продолжают работать выражения?
>>> (1 +
... 2)
3
Выражениям нет дела до отступов. Они заканчиваются, когда все паренсы / скобки / фигурные скобки уравновешены в конце строки, а не тогда, когда следующая строка не смещена. Итак, как только вы введете этот 2)
, он узнает, что ввод завершен, и может скомпилировать его.
То же самое верно и для продолжения с обратным слешем:
>>> 1 + \
... 2
3
Нет необходимости в незаштрихованной строке; как только вы введете 2
без продолжения с обратной косой чертой, ввод будет завершен.