Can someone explain to me why I get <function <lambda>.<locals>.<lambda> at 0x0000000002127F28>
instead of 3
?
>>> foo = True
>>> bar = lambda x: x + 1 if foo else lambda x: x + 2
>>> bar(1)
2
>>> foo = False
>>> bar = lambda x: x + 1 if foo else lambda x: x + 2
>>> bar(1)
<function <lambda>.<locals>.<lambda> at 0x0000000002127F28> # Hey !? WTF ?
Python has a different order of operations than you think here. It seems you should change your definition to
bar = (lambda x: x + 1) if foo else (lambda x: x + 2)
What you were actually getting with your definition was
bar = lambda x: (x + 1 if foo else lambda x: x + 2)
In other words, you were returning a function, and if foo
is true the function returns the value of x+1
but if it is false it returns the function lambda x: x + 2
. What you really wanted was to return one of two functions, which the modified definition does.
The moral of this story: use plenty of parentheses to make your intentions clear.
A comment to your question suggests another possibility:
bar = lambda x: x + 1 if foo else x + 2
which is equivalent to
bar = lambda x: (x + 1 if foo else x + 2)
This is not the same as my suggestion. My suggestion, when executed, returns one of two functions. One function always adds one, the other always adds 2, and which function is returned depends on the value of foo
when the definition line is executed. The alternative here returns just one function, and this function adds one or two depending on the value of foo
when the function is evaluated. Do you see the difference? The alternative changes more frequently. Only you can say which of these meets your needs.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With