Python 2 和 Python 3 内置的 all() 函数表现不一样

Python 2 and Python 3 built-in all() function not behaving equally

以下代码:

a = None
b = None
all([a, b, a > b]) # Returns False in python 2 but TypeError in python 3

python 错误 3:

TypeError: '>' not supported between instances of 'NoneType' and 'NoneType'

好像是python2版本短路了,但是python3版本没有。是这样吗?为什么会这样?这是一个错误吗?我应该举报吗?

我已经在 Python 2.7.17、3.6.9 和 3.8.2

中测试了这段代码

短路无关紧要。在执行 all 之前评估整个列表。

Python 2 比较宽松。在 Python 2 中,您可以在字符串和整数、许多不同类型的对象和 None 之间使用 <,而不会出现错误。在 Python 3 中,规则收紧了,因此您只能在具有明确含义的情况下使用 <

如果您需要的功能是

a and b and a > b

那我建议你用那个。对于该表达式,如果 abNone.

,则不会计算 a > b

不是错误,这是故意的。

Python 3 是对 Python 2 的改进。从逻辑上讲,这应该给您一个错误,因为您无法比较是否没有什么比某物更大,因为,嗯,它是什么都没有!

使用 Python 2 也毫无意义,除非您有一些遗留代码需要 is(但即使那样我也会尝试移动到 Python 3)作为 support for Python 2 stopped 01/01/2020