我的代码中有以下行:
processed = [singleRun.postProcess() for singleRun in simObjects if singleRun._ran]
postProcess() 函数需要几秒钟来运行每个 simObject,在这段时间内更多的 simObjects 可能有它们的 ._ran 属性变为 True
_ran 是 simObjects 类的一个@property,它可以作为该脚本范围之外的操作的结果而改变。
postProcess() 是在从 simObjects 列表迭代每个对象并传递 if 语句时运行,还是 postProcess() 的列表' d 生成并然后评估?
完全公开(我现在意识到这一点非常重要):脚本正在向分布式计算系统提交计算作业并检查文件以查看它们何时完成(通过@property,._ran), 所以这个问题的原因是要么列表是由 _ran 首先生成的,要么每个对象都是 postProcess() 的,因为它被迭代了在列表中(发现是 _ran)。
请您参考如下方法:
如果条件 (if singleRun._ran) 的计算结果为 True,则调用
postProcess() 一次。 您可以使用以下虚拟测试来测试列表压缩的行为:
def foo():
print 'foo'
test = [foo() for f in [1, 2, 3, 4, 5] if f % 2 == 0]
“foo”只会打印两次,因为列表中只有 2 个偶数。
或实例:
class Foo(object):
def m(self):
print 'm called'
objects = [Foo(), Foo(), Foo(), Foo(), Foo()]
x = [obj.m() for i, obj in enumerate(objects) if i % 2 == 0]
当您编写“伪三元运算符”(老实说,我不知道它在 Python 中是否有特殊名称)表达式时,Python 会应用相同的惰性方法,例如:
foo() if condition else bar()
在这种情况下,仅当条件为真时才调用 foo(),尽管事实上它首先出现......Python 足够聪明,可以避免不必要的额外计算;)
