Это полностью определенное поведение, а не случайная функция. Оператор цепочки определяется в Comparison operators section:
Сравнения могут быть соединены произвольно, например, x < y <= z
эквивалентно x < y and y <= z
, за исключением того, что y
вычисляется только один раз (но в обоих случаях z
не оцениваются на всех, когда x < y
найден быть ложным).
in
является одним из операторов сравнения; из того же раздела:
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
| "is" ["not"] | ["not"] "in"
Никакие исключения не сделаны для комбинаций, которые могут не иметь большого смысла.
Конкретное выражение, которое вы использовали в качестве примера, таким образом исполняется как 'a' in 'ab' and 'ab' in 'abc'
, причем только один экземпляр 'ab'
выполняется (загружается).
Я смотрел раздел [сравнения] (https://docs.python.org/3/library/stdtypes.html#comparisons) на другой странице, которая не отображает 'in' – Eric
@Eric в нижней части этого раздела: * Еще две операции с одним и тем же синтаксическим приоритетом 'in' и' not in' поддерживаются только типами последовательностей (ниже). * Из-за этого ограничения они не указаны в таблице. –