CPython 拡張タイプに != と == を実装するにはtp_compare
、を実装する必要がtp_richcompare
ありますか?
それぞれがどのような状況で呼び出されますか?
tp_richcompare
Python 言語自体の豊富な比較の特別なメソッドに類似しています。tp_compare
これは、比較演算子がクラスで呼び出されるときに優先して選択されます。
tp_richcompare
比較ロジックを細かく制御したい場合に使用します。たとえば、同等性を判断するための非常に安価な方法があるかもしれませんが、優先順位はありません。Saymemcmp(a, b, sizeof(*a)) == 0
は、2 つの非常に複雑なデータ構造が等しいことを示しますが、それが 未満であるmemcmp(a, b, sizeof(*a)) < 0
ことを示すわけではありません。その代わりに、決定に高価なアルゴリズムが必要になります。この関数では、 、またはを返すために、常に高価なアルゴリズムを使用する必要があります。関数 OTOH は、どちらの比較が意図されているかを教えてくれるので、当面の必要性に応じて、高価なアルゴリズムまたは安価なアルゴリズムのいずれかを選択できます。a
b
tp_compare
-1
0
1
tp_richcompare
の追加の利点は、空間内のwhereやare ポイントtp_richcompare
など、意味のない操作に対して例外を発生させることができることです。u < v
u
v