Я не знал об этом, но по-видимому and
и or
ключевые слова не являются операторами. Они не появляются в списке операторов Python. Только из чистого любопытства, почему это? И если они не операторы, каковы точно они?
Потому что это конструкции управляющего потока. Конкретно:
и
вычисляется к False, то правый аргумент вообще не вычисляется или
вычисляется к True, то правый аргумент вообще не вычисляетсяТаким образом, речь идет не просто о том, чтобы быть зарезервированными словами. Они не ведут себя как операторы, так как операторы всегда вычисляют все свои аргументы.
Это можно противопоставить битовым двоичным операторам, которые, как следует из названия, являются операторами :
>>> 1 | (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> 1 or (1/0)
1
Как видите, битовое ИЛИ (|
) вычисляет оба своих аргумента. Ключевое слово или
, однако, вообще не оценивает свой правый аргумент, когда левый аргумент вычисляется как True; поэтому во втором утверждении не поднимается ZeroDivisionError
.
Они классифицируют их как ключевые слова ранее в документе.
Это ключевые слова , потому что это зарезервированные идентификаторы, а не специальные маркеры символов.
Они не могут быть переопределены для поддержки операций с конкретными типами, поэтому они не попадают в область действия других операторов.
Python в настоящее время не предоставляет никаких специальных методов ' xxx ', соответствующих логическим операторам 'and', 'or' and 'not'. В случае 'and' и 'or' наиболее вероятная причина заключается в том, что эти операторы имеют семантику короткого замыкания, то есть второй операнд не оценивается, если результат может быть определен по первому операнду. Поэтому обычный метод предоставления специальных методов для этих операторов не работает.
Источник: PEP 335
PEP 335 рассказывает о добавлении возможности иметь перегружаемые операторы и немного обсуждает этот вопрос.