On Sun, 01 Jul 2012 09:35:40 +0200, Thomas Jollans wrote: > On 07/01/2012 04:06 AM, Steven D'Aprano wrote: >> On Sun, 01 Jul 2012 00:05:26 +0200, Thomas Jollans wrote: >> >>> As soon as you read it as a ternary operator, >> >> Well that's your problem. Why are you reading it as a ternary operator? >> It isn't one. It is a pair of chained binary operator. >> >> How can you tell that it is a pair of binary operators, rather than a >> single ternary operator? >> >> 1) There are TWO operators, hence a pair, not a single ternary >> operator; >> >> 2) each operator takes TWO arguments, not three. > > This is simply wrong. The comparisons are not acting as binary > operators.
Of course they are. Take this chained comparison: a < b == c There are exactly TWO operators. Each one takes TWO arguments. The < operator takes a and b as arguments. That's TWO, not three. The == operator takes b and c arguments. Again, that's TWO, not three. If you want to claim that this is a ternary operator, you need to explain: 1) What is the operator in this expression? Is it < or == or something else? 2) What double-underscore special method does it call? Where is this mysterious, secret, undocumented method implemented? 3) Why do the Python docs lie that a < b == c is exactly equivalent to the short-circuit expression (a < b) and (b == c) with b evaluated once? 4) And how do you explain that the compiled byte code actually calls the regular two-argument binary operators instead of your imaginary three- argument ternary operator? py> from dis import dis py> dis(compile("a < b == c", "", "single")) 1 0 LOAD_NAME 0 (a) 3 LOAD_NAME 1 (b) 6 DUP_TOP 7 ROT_THREE 8 COMPARE_OP 0 (<) 11 JUMP_IF_FALSE_OR_POP 23 14 LOAD_NAME 2 (c) 17 COMPARE_OP 2 (==) 20 JUMP_FORWARD 2 (to 25) >> 23 ROT_TWO 24 POP_TOP >> 25 PRINT_EXPR 26 LOAD_CONST 0 (None) 29 RETURN_VALUE -- Steven -- http://mail.python.org/mailman/listinfo/python-list