Сопоставимый тип в модуле расширения
Вопрос
Для реализации! = И == Для моего типа расширения CPY, если я должен реализовать tp_compare
, tp_richcompare
или оба?
При каких обстоятельствах каждый из них называется?
Решение
tp_richcompare
аналогичен богатому сравнению Специальные методы на самом языке питона. Это выбрано в предпочтении tp_compare
Когда операторы сравнения вызываются на классе.
Использовать tp_richcompare
Когда вы хотите более тонкий контроль над логикой сравнения. Например, может быть очень дешевый способ определить равенство, но не приоритет. Сказать memcmp(a, b, sizeof(*a)) == 0
Указывает, что две очень сложные структуры данных равны, но memcmp(a, b, sizeof(*a)) < 0
не указывает на это a
меньше чем b
, Что вместо этого требуется дорогой алгоритм для определения. То tp_compare
Функция потребуется, чтобы вы всегда используете дорогой алгоритм, чтобы вернуть либо -1
, 0
или 1
. Отказ То tp_richcompare
Функция, OTOH, говорит вам, какое сравнение предназначено, поэтому вы можете выбрать дорогой, либо дешевый алгоритм, в зависимости от необходимости под рукой.
Дополнительное преимущество tp_richcompare
это то, что вы можете поднять исключения для операций, которые не имеют смысла, например u < v
куда u
а также v
указываются в космосе.