Define True, если не определено, вызывает синтаксическую ошибку
Я нашел следующую конструкцию сегодня в некотором elses-коде:
try: True, False
except NameError: True = 1==1; False = 1==0
Как я понимаю, он определяет True
и False
, если они уже не определены. Поэтому, если они определены, он не должен выбрасывать NameError
-Exception, правильно?
Я попробовал это для себя в оболочке, и он показывает мне SyntaxError: can't assign to keyword
Мой вопрос в том, почему он даже выстрелил в синтаксическую ошибку, если определены True и False? Если True и False доступны в моей системе, разве это не должно пройти мимо обработки исключений и не показывать синтаксическую ошибку?
Ответы
Ответ 1
Этот код написан для Python 2.x и не будет работать на Python 3.x(в котором True
и False
являются истинными ключевыми словами).
Так как True
и False
являются ключевыми словами в Python 3, вы получите SyntaxError
, который вы не можете поймать.
Этот код существует из-за очень старых версий Python. В Python 2.2 (выпущен в 2001 году!) True
и False
не существовали как предопределенные имена, поэтому этот код предоставил бы совместимые определения, чтобы более поздний код мог просто использовать True
и False
.
При преобразовании кода Python 2.x в Python 3.x удалите эти строки; они историчны и не используются в Python 3.x. Если вы видите эти строки в чужом коде, они являются верным признаком того, что программа не была записана или перенесена на Python 3.
Ответ 2
SyntaxError
отображается во время этапа байтовой компиляции, прежде чем код будет запущен, поэтому вы не сможете обойти его с помощью try
/except
.
Ответ 3
Буферный тип был введен в Python 2.3: https://docs.python.org/2.3/whatsnew/section-bool.html
Таким образом, часть кода была для старой версии Python, например. 2.3+ для поддержки очень старой версии Python (т.е. До 2.3)