Почему Python не обнаруживает ошибки перед выполнением?

Предположим, у меня есть следующий код в Python:

a = "WelcomeToTheMachine" if a == "DarkSideOfTheMoon": awersdfvsdvdcvd print "done!" 

Почему эта ошибка не возникает? Как он компилируется? В Java или C # это будет замечено во время компиляции.

3 Solutions collect form web for “Почему Python не обнаруживает ошибки перед выполнением?”

Python не является компилируемым языком, поэтому ваш код не бросает ошибки компиляции.

Python – это интерпретируемый язык байтового кода. Технически исходный код «компилируется» в байтовый код, но тогда байт-код как раз вовремя (JIT) скомпилирован при использовании PyPy или Pyston, иначе он интерпретируется по строкам.

Рабочий процесс выглядит следующим образом:

Ваш код Python -> Компилятор -> .pyc файл -> Интерпретатор -> Ваш выход

Использование стандартного времени выполнения python Что все это значит? По сути, вся тяжелая работа происходит во время выполнения, в отличие от C или C ++, где исходный код целиком анализируется и переводится в двоичный файл во время компиляции.

Во время «компиляции» python почти полностью проверяет ваш синтаксис. Поскольку awersdfvsdvdcvd является допустимым идентификатором, ошибка не возникает до тех пор, пока эта строка не будет выполнена. Просто потому, что вы используете имя, которое не было определено, не означает, что оно не может быть определено в другом месте … например:

 globals()['awersdfvsdvdcvd'] = 1 

ранее в файле было бы достаточно, чтобы подавить NameError , который произошел бы, если бы была NameError строка с ошибочным именем.

Итак, не может ли python просто искать выражения глобалов? Ответ на это снова «нет». Из модуля «foo» я могу добавить к глобалам модуля «бар» аналогичным образом. И python не знает, какие модули будут импортированы или будут импортированы до тех пор, пока он не будет запущен (я могу динамически импортировать модули во время выполнения).


Обратите внимание, что большинство причин, о которых я упоминаю, почему Python как язык не может дать вам предупреждение об этих вещах, связаны с тем, что люди делают сумасшедшие вещи. Есть ряд инструментов, которые будут предупреждать вас об этих вещах (полагая, что вы не собираетесь делать такие глупые вещи). Моим любимым является pylint , но практически любой pylint python должен быть в состоянии предупредить вас о неопределенных переменных. Если вы зацепите linter до вашего редактора, большую часть времени вы можете поймать эти ошибки до того, как вы действительно запустите код.

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

Python - лучший язык программирования в мире.