今回は、不等号の実処理について、2つのケースを見てみたいと思います。
[ケース1]
以下のような、__lt__() と __eq__() が定義されたクラスを考えます。
class Stored(object): def __init__(self, value): self.value = value def __lt__(self, rhs): # < if isinstance(rhs, Stored): return self.value < rhs.value return NotImplemented def __eq__(self, rhs): # == if isinstance(rhs, Stored): return self.value == rhs.value return NotImplementedこのクラスは < と == に対応しているわけですから、あわよくば < と == の OR を取って、<= 演算子が反応するかとも思いますが、、、
>>> Stored(1) <= Stored(1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '<=' not supported between instances of 'Stored' and 'Stored'< と == を元に <= を推測する機能はありません。
前回見たように、== 演算子は is 演算子を使う動作となっているため、あくまで大小比較をする <= 演算子とは別次元という考え方なのかもしれません。
[ケース2]
以下のような __ge__() だけが定義されたクラスを考えます。
class Stored(object): def __init__(self, value): self.value = value def __ge__(self, rhs): # >= if isinstance(rhs, Stored): return self.value >= rhs.value return NotImplemented>= の否定が < になるはずなので、>= に対応するこのクラスに < 演算子が反応しても良いかと思いますが、、、
>>> Stored(1) < Stored(1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '<' not supported between instances of 'Stored' and 'Stored'>= を元に < を推測する機能はありません。
ケース1と合わせて見ると、他の演算子から別の演算子の結果を推測することはあまり行われないようです。!= 演算子が == 演算子を使っていることが特殊ルールである見なすのが良さそうですね。
0 件のコメント:
コメントを投稿