Python 全部与 None 元件短路
Python all short-circuiting with None element
我到处都看到 Python all
和 any
函数支持短路。
然而:
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
,因为 a
是 None
。
为什么会这样?这是因为每个术语都是在调用之前评估的吗?我是否被迫使用 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
?
我不会说“强制”——我敢肯定还有其他令人费解的选择——但是,是的,这是显而易见的惯用写法。
我到处都看到 Python all
和 any
函数支持短路。
然而:
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
,因为 a
是 None
。
为什么会这样?这是因为每个术语都是在调用之前评估的吗?我是否被迫使用 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 ina is not None and a + 1 > 2
?
我不会说“强制”——我敢肯定还有其他令人费解的选择——但是,是的,这是显而易见的惯用写法。