Каков конкретный код, чтобы он исполнялся, когда я просил что-то вроде
>>> 1 <= 3 >= 2
True
Если оба имеют одинаковый приоритет и это просто порядок их оценки, то почему второе неравенство функционирует как (3 >= 2)
вместо (True >= 2)
Рассмотрим, например, разницу между этими
>>> (1 < 3) < 2
True
>>> 1 < 3 < 2
False
Это просто чистая синтаксическая короткая резка, закодированная в Python, для расширения второй как and
двух операторов?
Могу ли я изменить это поведение для класса, чтобы a <= b <= c
расширялся до чего-то другого? Это выглядит так:
a (logical operator) b (logical operator) c
--> (a logical operator b) and (b logical operator c)
но реальный вопрос заключается в том, как это реализуется в коде.
Мне любопытно, чтобы я мог реплицировать поведение типа __lt__
и __gt__
в некоторых из моих собственных классов, но я смущен тем, как это выполняется, поддерживая константу среднего аргумента.
Вот пример:
>>> import numpy as np
>>> tst = np.asarray([1,2,3,4,5,6])
>>> 3 <= tst
array([False, False, True, True, True, True], dtype=bool)
>>> 3 <= tst <= 5
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/home/ely/<ipython-input-135-ac909818f2b1> in <module>()
----> 1 3 <= tst <= 5
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Было бы неплохо переопределить это, чтобы он "просто работал" с массивами, например:
>>> np.logical_and(3 <= tst, tst <= 5)
array([False, False, True, True, True, False], dtype=bool)
Добавлен для уточнения
В комментариях указано, что я плохо объяснил этот вопрос. Вот некоторые поясняющие замечания:
1) Я не ищу простого объяснения того факта, что интерпретатор выскакивает and
между двумя цепными неравенствами. Я уже знал это и сказал это выше.
2) По аналогии с тем, что я хочу сделать, рассмотрим оператор with
(ссылка). Следующее:
with MyClass(some_obj) as foo:
do_stuff()
распаковывается в
foo = MyClass(some_obj)
foo.__enter__()
try:
do_stuff()
finally:
foo.__exit__()
Итак, написав MyClass
соответствующим образом, я могу делать много специальных вещей внутри оператора with
.
Я спрашиваю, есть ли аналогичная распаковка кода прикованного неравенства, с помощью которого я могу перехватить то, что он делает, и перенаправить его на использование логических операторов в стиле массива, а не только на классы, которые меня волнуют.
Я чувствую, что это очень ясно из моего вопроса, особенно пример, но, надеюсь, это делает его более понятным.