steve+comp.lang.python at pearwood.info
Mon Jul 2 02:43:44 CEST 2012
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
>> 2) each operator takes TWO arguments, not three.
> This is simply wrong. The comparisons are not acting as binary
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
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)
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
>> 25 PRINT_EXPR
26 LOAD_CONST 0 (None)
More information about the Python-list