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
的子类型)