Цепочки "есть" операторы

Поддерживает ли цепочка python цепочку is операторов, таких как:

a = None
b = None
a is b is None

Это выводит True, некоторые ссылки на doc будут приятными.

Ответ 1

Да. Любые операторы, классифицированные как сравнения, могут быть связаны цепями. Из справочной системы :

Формально, если a, b, c,..., y, z являются выражениями и op1, op2,..., opN являются операторами сравнения, то a op1 b op2 c ... y opN z эквивалентно до a op1 b and b op2 c and ... y opN z, за исключением того, что каждое выражение оценивается не более одного раза.

Операторы сравнения: <, >, ==, >=, <=, <> (малоиспользуемый синоним для !=, ушедший на Python 3), !=, is, is not, in и not in.

Ответ 2

Да. См. сравнительные документы.

Сравнение может быть скоблено произвольно, например, x < y <= z эквивалентно к x < y и y <= z, за исключением того, что y оценивается только один раз (но в обоих случаи z вообще не оцениваются, когда x < y считается ложным).

Формально, если a, b, c,..., y, z являются выражениями и op1, op2,..., opN являются операторами сравнения, то op1 b op2 c... y opN z эквивалентен к операциям op1 b и b op2 c и... y opN z, за исключением того, что каждое выражение оценивается не более одного раза.

Что делает оператор сравнения:

Операторы являются и не проверяются для идентичности объекта: x is y истинно тогда и только тогда, когда x и y - один и тот же объект. x не означает, что y обратное значение истинности.

Ответ 3

Ссылка на документацию по грамматике Python, которая читается Python для разбора исходных файлов (поэтому это источник):

comparison: expr (comp_op expr)*
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

expr (comp_op expr)* следует читать, на простом английском языке, "любое количество выражений, разделенных оператором сравнения," из которых is один. Это означает, что да, вы можете приковать любое число is сравнение друг с другом.

Чтобы продемонстрировать, что сравнения связаны между собой:

>>> a = b = c = 'foo'
>>> a is b
True
>>> a is b is c
True
>>> True is c
False