我今天在别人的代码中发现了以下构造:
try: True, False
except NameError: True = 1==1; False = 1==0
据我所知,它定义了True
和False
,如果它们还没有定义的话。所以,如果定义了它们,就不应该抛出NameError
-异常,对吧?
我在一个壳里试过这个,它给我看了SyntaxError: can't assign to keyword
我的问题是,如果定义了True和False,为什么它甚至会引发语法错误?如果True和False在我的系统上可用,难道它不应该通过异常处理而不显示语法错误吗?
此代码是为Python 2.x编写的,不会在Python 3.x上工作(其中True
和False
是真正的关键字)。
由于True
和False
是Python3中的关键字,您将得到一个无法捕获的SyntaxError
。
这段代码的存在是因为Python的旧版本。在Python2.2(2001年发布!)中,True
和False
不作为预定义名称存在,因此此代码将提供兼容的定义,以便以后的代码可以简单地使用True
和False
。
将Python 2.x代码转换为Python 3.x时,请删除这些行;它们是历史性的,在Python3.x中没有用处。如果你在别人的代码中看到这些行,它们肯定表明该程序不是为Python3编写或移植的。
SyntaxError
出现在字节编译阶段,在代码运行之前,因此使用try
/except
无法绕过它。
布尔类型是在Python 2.3中引入的:https://docs.python.org/2.3/whatsnew/section-bool.html
因此,这段代码适用于旧版本的Python,例如2.3+,以支持非常旧的Python版本(即2.3之前的版本)