【问题标题】:Define True, if not defined, causes syntax error定义 True,如果没有定义,会导致语法错误
【发布时间】:2015-06-25 14:41:39
【问题描述】:

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

try: True, False
except NameError: True = 1==1; False = 1==0

据我了解,它定义了 TrueFalse(如果它们尚未定义)。因此,如果它们被定义,它不应该抛出NameError-Exception,对吧?

我已经在 shell 中为自己尝试过,它显示了 SyntaxError: can't assign to keyword

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

【问题讨论】:

标签: python python-3.x


【解决方案1】:

此代码是为 Python 2.x 编写的,不适用于 Python 3.x(其中 TrueFalse 是真正的关键字)。

由于TrueFalse 是Python 3 中的关键字,你会得到一个你无法捕捉到的SyntaxError

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

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

【讨论】:

  • “它们是一个明确的迹象,表明该程序不是为 Python 3 编写或移植的”——或者这个时代的任何 Python 版本……xD
  • 他们改用了什么? ints 用于布尔逻辑?
  • 是的,他们确实使用了 1 和 0。请注意,TrueFalse 在 Python 2.2.1 中被添加为常量,但它们分别被简单地定义为 10 .实际的 bool 类型仅在 Python 2.3 中通过 PEP 285 添加。
  • (直到今天,bool 仍然是int 的子类型)
【解决方案2】:

SyntaxError 出现在字节编译阶段,在代码运行之前——所以你无法用try/except 绕过它。

【讨论】:

    【解决方案3】:

    在 Python 2.3 中引入了布尔类型:https://docs.python.org/2.3/whatsnew/section-bool.html

    所以那段代码适用于旧版本的 Python,例如2.3+ 支持非常旧的 Python 版本(即 2.3 之前的版本)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2014-04-29
      相关资源
      最近更新 更多