For example:
def foo():
print 'foo'
return 1
if any([f() for f in [foo]*3]):
print 'bar'
I thought the above code should output:
foo
bar
instead of :
foo
foo
foo
bar
Why ? how can I make the "short-circuit" effect ?
Deconstruct your program to see what is happening:
>>> [f() for f in [foo]*3]
foo
foo
foo
[1, 1, 1]
>>>
You are already creating a list and passing to any and have printed it 3 times.
>>> any ([1, 1, 1])
True
This is fed to if statement:
>>> if any([1, 1, 1]):
... print 'bar'
...
bar
>>>
Solution: Pass a generator to any
>>> (f() for f in [foo]*3)
<generator object <genexpr> at 0x10041a9b0>