On Apr 2, 7:05 am, Steve Howell <showel...@yahoo.com> wrote: > On Apr 2, 2:04 am, Steven D'Aprano <st...@remove-this- > > > > cybersource.com.au> wrote: > > On Thu, 01 Apr 2010 21:16:18 -0700, Steve Howell wrote: > > > The ironic thing about the ternary operator is that it is not really > > > ternary; it's binary. Even just making an expression from a binary > > > operator inevitably leads to syntax hell. > > > > There is a principle of programming that I would like to coin, which is > > > the "Tyranny of Three." > > > > It is impossible to code for any expression that has three possible > > > values in any kind of elegant way. It's just impossible. Try to code > > > the bowling game without tearing out your teeth--three conditions: > > > strike, spare, or normal. > > > > The tyranny of three is that 3 is too small for an elegant N-based > > > solution and too large for a simple condition. > > > I'm afraid I don't understand any of that. Can you explain further? > > > How is the ternary operator "not really ternary, it's binary"? It > > requires three arguments, not two, which makes it ternary. In Python > > syntax: > > Of course, I understand that the ternary operator has three arguments, > but it only has two possible outcomes. > > You asked me to elaborate on the "Tyranny of Three." Let's say you > have three possible outcomes. > > In some languages you would write something like this: > > mark = (rolls == 1) && (pins == 10) ? 'strike' : > (rolls == 2) && (pins == 10) ? 'spare' : > 'normal' > > Many people consider the above very ugly, so they write it like so: > > if pins == 10: > if rolls == 1: > return 'strike' > else: > return 'spare' > else: > return 'normal' > > Then the next programmer comes along and "cleans up": > > if pins == 10: > return 'strike' if rolls == 1 else 'spare' > else: > return 'normal' > > Then there is this alternative: > > if rolls == 2: > return 'spare' if pins == 10 else 'normal' > else: > return 'strike' > > And then: > > if rolls == 2: > if pins == 10 > return 'spare' > else > return 'normal > else: > return 'strike' > > Or even this: > > return 'strike' if rolls == 1 else ('spare' if pins == 10 else > 'normal') > > The "Tyranny of Three" refers to a problem where there are an infinite > number of valid solutions, but none of them have any essential beauty, > so they lead to endless nitpicking and code churn.
I forgot this one: def obfuscated_triager(rolls, pins, lookup = ['normal'] * 10 + ['strike'] + [None] * 9 + ['spare'] ): return lookup[rolls * pins] -- http://mail.python.org/mailman/listinfo/python-list