Python 定义为True,如果未定义,将导致语法错误

Python 定义为True,如果未定义,将导致语法错误,python,python-3.x,Python,Python 3.x,我今天在别人的代码中发现了以下构造: try: True, False except NameError: True = 1==1; False = 1==0 据我所知,它定义了True和False,如果它们尚未定义。因此,如果定义了它们,它不应该抛出namererror-异常,对吗 我自己在一个shell中尝试过这个,它显示了SyntaxError:cannotassigntokeyword 我的问题是,如果定义了True和False,为什么它甚至会抛出语法错误?如果我的系统上有True和F

我今天在别人的代码中发现了以下构造:

try: True, False
except NameError: True = 1==1; False = 1==0
据我所知,它定义了
True
False
,如果它们尚未定义。因此,如果定义了它们,它不应该抛出
namererror
-异常,对吗

我自己在一个shell中尝试过这个,它显示了
SyntaxError:cannotassigntokeyword


我的问题是,如果定义了True和False,为什么它甚至会抛出语法错误?如果我的系统上有True和False,它不应该只经过异常处理而不显示语法错误吗

SyntaxError
在字节编译阶段出现,在代码运行之前——因此您无法使用
try
/
绕过它,除非

此代码是为Python2.x编写的,不会在Python3.x上工作(其中
True
False
是True关键字)

由于
True
False
是Python3中的关键字,因此您将得到一个无法捕获的
SyntaxError

这段代码的存在是因为Python的版本非常旧。在Python2.2(于2001年发布!)中,
True
False
不作为预定义名称存在,因此此代码将提供兼容的定义,以便以后的代码可以简单地使用
True
False


将Python2.x代码转换为Python3.x时,删除以下行;它们是历史性的,在Python3.x中没有用处。如果您在其他人的代码中看到这些行,它们肯定表明该程序不是为Python 3编写或移植的。

布尔类型是在Python 2.3中引入的:


因此,这段代码是针对Python的旧版本的,例如2.3+以支持非常旧的Python版本(即2.3之前的版本)

这些行使代码与Python 2.3之前的版本兼容。(见附件)。但是没有人使用python“这是一个明确的信号,表明程序不是为python 3编写或移植的”——或者是这个时代的任何python版本……他们使用了什么
int
s表示布尔逻辑?的确,他们使用了1和0。请注意,
True
False
在Python2.2.1中作为常量添加,但它们分别被简单地定义为
1
0
。实际的
bool
类型仅通过在Python 2.3中添加。(到目前为止,
bool
仍然是
int
的子类型)