[Python-ideas] if expensive_computation() as x:

Chris Angelico rosuav at gmail.com
Fri Feb 14 03:58:54 CET 2014


Responding to your post in different order to the original.

On Fri, Feb 14, 2014 at 8:59 AM, Ram Rachum <ram.rachum at gmail.com> wrote:
> If you'd like to bind to a variable only a part of the condition, this would
> work too:
>
>     if x<5 with expensive_computation_0() as x:
>         # Do something with x

Definitely don't like this syntax - while it might be useful to
snapshot part of a condition (I've done it in C plenty of times), this
notation feels clumsy. However...

> My suggestion:
>
>     if expensive_computation_0() as x:
>         # Do something with x...
>     elif expensive_computation_1() as x:
>         # Do something with x...
>     elif expensive_computation_2() as x:
>         # Do something with x...

... this simpler form does look reasonable. The "as" part will *only*
come at the end of the expression, and it *always* applies to the
whole expression, so it's fairly clear.

There is another cheat you can do, though, and that's to use break or
return instead of an elif chain. Going back to your original:

> The code paraphrased is this:
>
>     if expensive_computation_0():
>         x = expensive_computation_0()
>         # Do something with x...
>     elif expensive_computation_1():
>         x = expensive_computation_1()
>         # Do something with x...
>     elif expensive_computation_2():
>         x = expensive_computation_2()
>         # Do something with x...

the alternative would be something like this:

while "allow_break":
    x = expensive_computation_0():
    if x:
        # Do something with x...
        break
    x = expensive_computation_1():
    if x:
        # Do something with x...
        break
    x = expensive_computation_2():
    if x:
        # Do something with x...
        break
    # whatever your 'else' clause would be, if any
    break

Or, using a function instead:

def allow_return():
    nonlocal everything, you, need
    x = expensive_computation_0():
    if x:
        # Do something with x...
        return
    x = expensive_computation_1():
    if x:
        # Do something with x...
        return
    x = expensive_computation_2():
    if x:
        # Do something with x...
        return
allow_return()

Both of them are abusing their keywords into gotos, but ultimately,
that's what if/elif/elif is anyway - as soon as you finish one elif,
you goto the end of the block. It's not perfect by any means, but it
works.

ChrisA


More information about the Python-ideas mailing list