Что происходит с этим синтаксисом python? (c == c in s)

Кто-то просто показал мне этот странный пример синтаксиса python. Почему [4] работает?

Я бы ожидал, что он будет оценивать как [5], так и [6], ни одна из которых не работает. Есть ли какая-то преждевременная оптимизация, которая не должна быть?

In [1]: s = 'abcd'

In [2]: c = 'b'

In [3]: c in s
 Out[3]: True

In [4]: c == c in s
Out[4]: True

In [5]: True in s
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-e00149345694> in <module>()
----> 1 True in s

TypeError: 'in <string>' requires string as left operand, not bool

In [6]: c == True
Out[6]: False

Ответ 1

Это тот же синтаксический сахар, который позволяет питону связывать несколько операторов (например, <) вместе.

Например:

>>> 0 < 1 < 2
True

Это эквивалентно (0<1) and (1<2), за исключением того, что среднее выражение оценивается только один раз.

Оператор c == c in s аналогичен эквиваленту (c == c) and (c in s), который оценивается как True.

Чтобы выделить более раннюю точку, среднее выражение оценивается только один раз:

>>> def foo(x):
...     print "Called foo(%d)" % x
...     return x
...
>>> print 0 < foo(1) < 2
Called foo(1)
True

Подробнее см. Справочник по языку Python.