and/or instead of if/else
Question:
After working through some toy examples, I could see that it’s possible to emulate the ternary operator of "c" condition?value_if_true:value_if_false
in Python using condition and value_if_true or value_if_false
.
I would like to know if it works in all cases and if it is better or worse than using value_if_true if condition else value_if_false
.
Answers:
It’s strictly worse: the conditional expression was added to the language specifically to avoid the problem with using ... and ... or ...
incorrectly.
# 0 is falsy
>>> True and 0 or 5
5
>>> 0 if True else 5
0
PEP-308 references "FAQ 4.16" for other workarounds to the problems with and/or
, though I can no longer track down what FAQ is being referred to, but it was eventually decided that a dedicated conditional expression was preferable.
For example, one could write
(True and [0] or [3])[0]
to ensure that the true-result is truthy, so that the false-result isn’t returned. The false-result has to be adjusted as well so that regardless of what result is produced, it can be indexed to finally provide the intended result.
After working through some toy examples, I could see that it’s possible to emulate the ternary operator of "c" condition?value_if_true:value_if_false
in Python using condition and value_if_true or value_if_false
.
I would like to know if it works in all cases and if it is better or worse than using value_if_true if condition else value_if_false
.
It’s strictly worse: the conditional expression was added to the language specifically to avoid the problem with using ... and ... or ...
incorrectly.
# 0 is falsy
>>> True and 0 or 5
5
>>> 0 if True else 5
0
PEP-308 references "FAQ 4.16" for other workarounds to the problems with and/or
, though I can no longer track down what FAQ is being referred to, but it was eventually decided that a dedicated conditional expression was preferable.
For example, one could write
(True and [0] or [3])[0]
to ensure that the true-result is truthy, so that the false-result isn’t returned. The false-result has to be adjusted as well so that regardless of what result is produced, it can be indexed to finally provide the intended result.