Hacker News 中文摘要

RSS订阅

Python预声明常量有点奇怪 -- Python's pre-declared constants are kinda weird

Python有6个预声明常量,它们的行为各不相同。True、False和None是关键字,在词法层面被解析,甚至不能作为属性名使用。debug是唯一不能赋值的标识符,用于调试模式控制。

正文

Python中有6个预声明的“常量”:True、False、None、__debug__、Ellipsis(或...)和NotImplemented,但它们的行为各有不同。

True、False和None是关键字,而非标识符,它们在词法分析阶段就被识别,这导致像x.True这样的表达式会引发SyntaxError。__debug__是一个布尔常量,在正常模式下为True,使用-O选项运行时为False。它虽然是普通标识符,但却是唯一不能被赋值的标识符,无论是直接赋值还是作为属性赋值都会报错。有趣的是,删除__debug__会触发SyntaxError,但删除其属性则不会。

Ellipsis和NotImplemented与其他4个常量不同,它们只是普通的内置函数,可以被全局变量覆盖。例如,NotImplemented = 67后,NotImplemented的值就变成了67。

尽管True、False和None是词法标记,但它们也作为内置函数存在,可以通过getattr(builtins, 'True')访问。更特别的是,setattr可以修改这些内置函数的值,但不会影响词法标记的访问结果。__debug__也有类似行为:修改builtins.__debug__不会改变__debug__的值。而Ellipsis和NotImplemented则可以被修改,但...作为符号常量不受影响。

评论

根据评论内容,总结如下:

主要观点一:Python的常量机制存在特殊性 - __debug__是Python中真正的“条件编译”常量,与assert类似,在PYTHONOPTIMIZE=1下会完全省略字节码(评论4) - True、False、None等常量在解析时被硬编码为词法标记,早期版本可被重新赋值(评论1、6)

主要观点二:对Python生态的负面评价 - 批评Python“缓慢、脆弱、难以大规模编写代码”,松散类型、标准库混乱、包管理器糟糕(评论3) - 认为Python是“最糟糕的语言和生态系统之一”,比JavaScript更差(评论8) - 形容Python是“三件套的脚本语言”(评论9)

主要观点三:Python的实用性与历史演变 - 2010年代Python曾被视为PHP和Perl的清新替代,但如今已显过时(评论3) - 早期版本无内置True/False,用户自行实现,Python 3后禁止重新赋值(评论6) - 有用户尝试创建常量库(评论5)

平衡性说明:评论中负面评价占多数(3、8、9),但部分评论(1、4、6)聚焦技术细节而非价值判断。未发现正面评价。