次のようなものを要求したときに実行される特定のコードは何ですか
>>> 1 <= 3 >= 2
True
両方の優先順位が等しく、それが評価の順序である場合、なぜ 2 番目の不等式(3 >= 2)
は(True >= 2)
たとえば、これらの違いを考えてみましょう
>>> (1 < 3) < 2
True
>>> 1 < 3 < 2
False
2 番目のステートメントを 2 つのステートメントのとして展開するために、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) 私は、インタプリタが連鎖した 2 つの不等式の間に飛び込むという事実の単純な説明を探しているわけではありません。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
私は、連鎖した不等式の同様のコードアンパッキングがあるかどうかを尋ねています.
これは私の質問、特に例から非常に明確だと思いますが、これでより明確になることを願っています。