Python 全部与 None 元件短路

Python all short-circuiting with None element

我到处都看到 Python allany 函数支持短路。 然而:

a = None
all((a is not None, a + 1 > 2))

抛出以下错误:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py", line 3331, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-6e28870e65c8>", line 1, in <module>
    all((a is not None, a + 1 > 2))
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

我原以为代码不会计算 a + 1 > 2,因为 aNone。 为什么会这样?这是因为每个术语都是在调用之前评估的吗?我是否被迫使用 a is not None and a + 1 > 2 中的 and 运算符?

需要先创建元组 (a is not None, a + 1 > 2),然后才能调用 all()TypeError 是在创建元组的过程中产生的。 all() 甚至没有机会 运行。

如果您想查看 all 的短路操作,请将生成器表达式传递给它。例如:

>>> all('foobaR'[i].islower() for i in range(7))
False

>>> all('foobar'[i].islower() for i in range(7))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <genexpr>
IndexError: string index out of range

在第一个 运行 中,all 在遇到 'R'.islower() 情况时停止,因为那是 False。在第二个 运行 中,它一直持续到 i == 6,这会触发索引错误。

Am I forced to use the and operator as in a is not None and a + 1 > 2?

我不会说“强制”——我敢肯定还有其他令人费解的选择——但是,是的,这是显而易见的惯用写法。