私がクラスを定義し、A
誰にも逃げずにそのクラスの不等式を書いてほしくない場合を考えてみましょう。
class A():
def __ne__(self, other):
return NotImplemented
print(A() != A())
しかし、これは印刷され、オペレーターを意図的に「オフ」にしTrue
たにもかかわらず、発生しませんか?TypeError
!=
私がクラスを定義し、A
誰にも逃げずにそのクラスの不等式を書いてほしくない場合を考えてみましょう。
class A():
def __ne__(self, other):
return NotImplemented
print(A() != A())
しかし、これは印刷され、オペレーターを意図的に「オフ」にしTrue
たにもかかわらず、発生しませんか?TypeError
!=
あなたが戻るとき、あなたはあなたが戻るべきかどうかわからNotImplemented
ないことを示します。__ne__
True
False
通常、Pythonはオペランドを交換します。a != b
結果がの場合、代わりにNotImplemented
試行しますb != a
。演算子の両側で同じタイプを使用するため、ここでも失敗します。演算子の場合!=
、Pythonはメモリアドレスの比較にフォールバックしますが、これらは同じではないため(2つの別々のインスタンス)、Falseが返されます。
詳細については、do_richcompare
C関数を参照してください。
TypeError()
それがあなたの期待される結果であるならば、あなたは手動で上げる必要があるでしょう。
例外を返すのではなく、例外を返すので、Trueが得られます。これは、テストの結果としてNull以外のオブジェクト(例外)を返すことを意味します。特に指定がない限り、Null以外のオブジェクトはTrueと評価されます。例外を発生させるまでは、例外は通常のオブジェクトであることに注意してください。
したがって、次のようなメソッドが必要です。
class A():
def __ne__(self, other):
raise NotImplementedError