On Wed, 23 Dec 2009 20:11:25 -0500, Terry Reedy wrote: >>> Instead the accepted, idiomatic Python way of writing this was to use >>> short-circuit booleans: >>> >>> result = condition and x or y >>> >>> However this idiom is buggy! If x is a false-value (say, 0) then >>> result gets set to y no matter what the value of condition. > > This is only a bug if one expects otherwise.
I'm not saying the behaviour of `a and x or y` is buggy, but that it's use as a replacement for a ternary conditional expression is buggy; the *idiom* is buggy, not the behaviour of and/or. If I say "you can make perfect hard boiled eggs by putting the egg in a glass of water in the microwave on high for eight minutes", and the egg explodes, that's not a bug in the microwave, that's a bug in the recipe. >>> This buggy idiom survived many years of Python development, missed by >>> virtually everyone. > > The last statement is false. The hazard of using and/or was well-known > back in '97 or so when I discovered or learned it and I believe it was > mentioned in the FAQ entry on the subject. We can argue about how well-known it was for somebody like Raymond Hettinger to miss it, and for whoever did a code-review of his application to also miss it. > The new alternative has the > hazard that the condition and if-branch must be written and read in a > backwards order. If you had asked me a couple of years ago, I would have agreed, but I've now come to the conclusion that `x if condition else y` is not only perfectly natural, but at least as natural as the conventional order of `if condition then x else y` (at least for expressions, not for if statements). "Steven, what are you doing on Monday night?" "Going to the movies if I can get away from work on time, otherwise sitting at home answering questions on comp.lang.python." -- Steven -- http://mail.python.org/mailman/listinfo/python-list