【发布时间】:2021-01-21 16:45:47
【问题描述】:
好吧,我的工作日可能很糟糕,但据我所知 all() 应该短路 according to the docs。
all() 应该等同于:
def all(iterable):
for element in iterable:
if not element:
return False
return True
这也相当于菊花链and。
所以下面应该做同样的事情:
all((True, print('This should print and stop'), print("this shouldn't print")))
True and print('This should print and stop') and print("this shouldn't print")
然而,最上面的两个都打印了(即,对每个部分都进行了全面评估) 但底部短路正常。
这是 Python (3.8.2) 的一个错误,还是我突然没有搞定?
【问题讨论】:
-
在您的
all中,第二个元素仍然是 Trueish,因为它不是空的。 -
print()返回None,在等价表达式中被视为Falsey。 -
但是
all正在做它应该做的事情:它从语句中返回False,但需要运行print来建立返回。运行它会导致打印... -
这与构造元组
t=(True, print('this'), False, print('not this'))没有什么不同,这是在调用all之前完成的。 -
是的。在精神上,当我这样做时,我的意思是它是一个发电机。第二次我意识到这是对 chepner 的回答的一个元组,我看到了我的缺陷以及与您的评论的关系。我仍然不同意“Trueish”评论,因为它从来都不是 Trueish,它只是被评估为构建一个元组。
标签: python python-3.x syntax