__cmp__
クラスの等価性を(メソッドを介して)再定義する既存のコードを使用しています。期待どおりに機能せず、修正しようとすると、理解できない動作に遭遇しました。__cmp__
組み込み関数を呼び出すだけのクラスで定義するcmp
と、常に最大の再帰深度に達すると予想されます。ただし、クラスのインスタンスをそれ自体と比較しようとすると、0 が返されます。
コードは次のとおりです。
class A:
def __cmp__(self, other):
return cmp(self, other)
a = A()
b = A()
cmp(a, a) # returns 0
cmp(b, b) # returns 0
cmp(a, b) # results in RuntimeError: maximum recursion depth exceeded
cmp
RuntimeError はわかりましたが、最初の 2 つの呼び出しが成功する理由がわかりません。
Python ドキュメントのデータ モデルセクションや、 Python の等価性のこの素晴らしい内訳のようなものを読みましたが、この再帰に対する答えが見つかりません。
そして、はい、書かれているように、これはまったく無意味なクラスであることを理解しています. 私が取り組んでいるコードは、特定の状況で平等を再定義しようとし、それ以外の場合はベースケースに落ちます。ベースケースは実装どおりに機能しないため、修正しようとしています。通話cmp
が機能する可能性があると考え、この問題を発見しました。これを理解することが、適切な解決策を見つけるのに役立つことを願っています。