Это называется operator chaining. Всякий раз, когда у вас есть выражение вроде A op1 B op2 C
с op1
и op2
сравнение, это значит "переведено" на A op1 B and B op2 C
. (Фактически он оценивает B
только один раз).
Примечание: оператор сравнения: in
, not in
, is
, is not
! (например, a is b is not None
означает a is b and b is not None
).
Если вы хотите взглянуть на байткод вы можете использовать модуль dis
:
In [1]: import dis
In [2]: dis.dis(lambda: True == True != False)
1 0 LOAD_CONST 1 (True)
3 LOAD_CONST 1 (True)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 2 (==)
11 JUMP_IF_FALSE_OR_POP 21
14 LOAD_CONST 2 (False)
17 COMPARE_OP 3 (!=)
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
Если вы читаете в байткод вы можете понять, что он выполняет оператор цепочки.
Учитывая, что выражение True == True != False
, которое «интерпретируется», как True == True and True != False
он сначала загружает дваTrue
константы для первого оператора через LOAD_CONST
байт-кода. DUP_TOP
дублирует верхнюю часть стека (это позволяет избежать переоценки True
для второго сравнения). Он выполняет первое сравнение (COMPARE_OP
), если оно ложно только для байт-кода 21, в противном случае он выталкивает верхнюю часть стека (JUMP_IF_FALSE_OR_POP
). Затем он выполняет второе сравнение.
Чтобы ответить на ваш общий вопрос, самый быстрый способ узнать о какой-либо функции python - использовать страницу документации quicksearch. Я также предлагаю прочитать Python's tutorial для общего ознакомления с языком.
Я хотел бы добавить, что, поскольку python предоставляет интерактивную среду, часто бывает легче понять, как работает какой-то код, записывая его в интерпретаторе и наблюдая за результатами.Почти все типы buil-in имеют документацию, доступную через docstrings, поэтому help(some_object)
должен предоставить вам много информации. В частности, IPython
предоставляет улучшенный интерактивный интерпретатор с более удобными справочными сообщениями/форматированием ошибок и т. Д.)
Спасибо, это было очень исчерпывающим. Я на самом деле использую IPython и вспомогательные функции и посмотрел его в документах, но у меня не было опыта работы с 'dis' или quicksearch. Ответ от @nickie дает некоторое представление о том, почему я хотел знать о 'dis'. Мой код оценивается с одинаковым значением как в Python, так и в типичной семантике, поэтому мой обычный подход (интерпретатор) не сокращает его. – dhill