私は、__richcmp__
をCython拡張タイプ(cdef class
)に実装しました。いくつかの比較ケースは定義されていません(たとえば<
)。as followsの場合はException
を使用しました。__richcmp__が部分的にしか実装されていない場合、TypeErrorを上げるべきですか?
def __richcmp__(Function self, Function other, op):
if other is None:
eq = False
else:
# guard against mixing managers
assert self.manager == other.manager
eq = (self.node == other.node)
if op == 2:
return eq
elif op == 3:
return not eq
else:
raise TypeError('Only `__eq__` and `__ne__` defined.')
私はこのCythonクラスのインスタンスのpprint
コンテナにしたいです。 pprint
attempts to compare(TypeError
を除く)。私の理解ではTypeError
として、pprint
未定義__lt__
の場合、または異なるタイプのオブジェクトの場合を予想していることである(またPython docsを参照してください)。
ただし、__richcmp__
はです。したがって、PythonではTypeError
が発生しません。 __richcmp__
が呼び出され、Exception
が呼び出され、それはpprint
によって無視されません。実装される__richcmp__
Cython requiresは、私は唯一の__eq__
と__ne__
を定義するオプションがありません。
私はTypeError
の向上に自分のコードを変更しました。 Pythonが__lt__
の不足をTypeError
と通信する場合、__lt__
が存在しないことを意味するために、__richcmp__
が存在するにもかかわらず、設計意図ではなくCythonを使用した副産物であるにもかかわらず、同じことを行う必要があります。 。
この推論は意味がありますか?別の種類の例外を発生させるべきですか?この文脈でTypeError
の意味を正しく解釈しましたか?