Python比较操作是否可返回数字而非布尔值?规范与实现疑问
Python真值测试文档表述引发的疑问
我在Python文档的《真值测试》中发现了一句令人惊讶的表述:
所有返回布尔结果的操作和内置函数,除非另有说明,否则为假时返回0或False,为真时返回1或True。
关系运算符似乎没有例外说明,因此我理解(IIUC),对于某些内置类型的值(例如7 < 3),它们可能返回0和1而非False和True,甚至可能是非确定性的。
因此,为了满足代码需生成bool类型值的规范要求,或是出于防御性编程的目的(在重要场景下),我是否应该用bool()调用包裹逻辑表达式?
附加问题
为何会存在这种灵活性?这是否会给CPython或其他实现带来某种便利?
补充说明(PEP 285相关)
问题已得到解答并被我采纳,但我想补充说明,在《PEP 285 – 添加bool类型》中我发现了以下表述:
- 所有概念上返回布尔结果的内置操作都将改为返回False或True而非0或1;例如比较操作、“not”运算符以及isinstance()这类断言函数。
- 所有定义为返回布尔结果的内置操作都将改为返回False或True而非0或1。具体包括比较操作(<、<=、==、!=、>、>=、is、is not、in、not in)、一元运算符‘not’、内置函数callable()、hasattr()、isinstance()和issubclass()、字典方法has_key()、字符串和unicode方法endswith()、isalnum()、isalpha()、isdigit()、islower()、isspace()、istitle()、isupper()和startswith()、unicode方法isdecimal()和isnumeric(),以及文件对象的‘closed’属性。operator模块中的断言函数也改为返回bool,包括operator.truth()。
- 唯一的变化是显式返回或赋值时表示真值的首选值。此前这些首选真值是0和1;本PEP将其改为False和True,并修改内置操作以返回这些首选值。
不过,PEP的权威性似乎低于文档(其中语言和库参考是核心部分),且存在大量与PEP不符的情况(其中许多已被明确提及)。因此我认为,在团队更新文档之前,PEP的更强保证不可轻信。
后续行动
我已在GitHub上提交了该Python问题。
内容的提问来源于stack exchange,提问作者ByteEater
相关产品推荐
相关产品推荐

