Сравнимый тип в модуле расширения - PullRequest
3 голосов
/ 19 мая 2010

Для реализации! = И == для моего типа расширения CPython я должен реализовать tp_compare, tp_richcompare или оба?

При каких обстоятельствах каждый из них называется?

1 Ответ

6 голосов
/ 19 мая 2010

tp_richcompare аналогично расширенному сравнению специальных методов в самом языке Python. Он выбирается в предпочтении 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 - это точки в пространстве.

...