2019年7月26日

演算子の話④ 不等号の実処理をもう少し

前回前々回と、< 演算子と == 演算子の実処理を見てきました。
今回は、不等号の実処理について、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 件のコメント:

コメントを投稿