pythonshort-circuiting

python boolean expression not "short-circuit"?


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 ?


Solution

  • 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>