Подтвердить что ты не робот

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 доступны в моей системе, разве это не должно пройти мимо обработки исключений и не показывать синтаксическую ошибку?

4b9b3361

Ответ 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)