code review

Steven D'Aprano 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
>> 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

```