Да, определение bar
выполнено, но определение не содержит ошибки. Это допустимый Python для определения функции, которая ссылается на глобальные переменные, которые еще не существуют, если они существуют при вызове функции. Учтите это:
def bar():
print x
x = 10
if __name__ == '__main__':
bar()
Это не приводит к ошибке. И это только разумно, поскольку даже если x
существует в то время, когда функция определена, ничто не помешает вам использовать del
позже. Точка, когда необходимо определить x
, - это когда bar
вызывается (если когда-либо), а не когда bar
определено.
Если бы Python работал так, как вы предлагаете, то было бы невозможно определить взаимно рекурсивные функции без странных хаков, таких как временное связывание одного имени с None
, а затем определение обеих функций.
РЕДАКТИРОВАТЬ: Чтобы уточнить ответ Игнасио на вопрос Олкотта в комментариях, да синтаксические ошибки обнаруживаются до того, как функция может быть выполнена, но на самом деле они обнаруживаются до того, как ее можно определить. 1017 *
Когда Python загружает файл, он анализирует все содержимое в операторах и затем выполняет операторы по одному. Синтаксическая ошибка означает, что он не смог успешно определить, какие операторы содержит файл, поэтому он не может выполнить что-либо . Таким образом, ошибка будет возникать при загрузке файла, что означает, что либо при непосредственном запуске его с интерпретатором, либо при import
.
Этот этап предварительной обработки известен как «время компиляции», хотя Python обычно не рассматривается как скомпилированный язык; он технически скомпилирован в формат байтового кода, но это почти совершенно неинтересно, потому что байтовый код в значительной степени просто непосредственно представляет операторы исходного кода.