Python nb_divide больше не доступен в Python 3 - PullRequest
0 голосов
/ 26 мая 2020

Я сделал пользовательский C -модуль для Python 2 через несколько лет go, который теперь я обновляю до Python 3 . Определение PyNumberMethods изменилось между 2 и 3, чтобы зарегистрировать класс, поддерживающий определенные операторы.

Python 2

У класса было два оператора деления. Я использовал первый, и он сработал.

typedef struct {
    binaryfunc nb_add;
    binaryfunc nb_subtract;
    binaryfunc nb_multiply;
    binaryfunc nb_divide; <-------
    binaryfunc nb_remainder;
    [...]
    binaryfunc nb_true_divide; <-------
    [...]
} PyNumberMethods;

Python 3

nb_divide было удалено, а вместо него nb_remainder. Это должна быть новая функция?

typedef struct {
    binaryfunc nb_add;
    binaryfunc nb_subtract;
    binaryfunc nb_multiply;
    binaryfunc nb_remainder; <-------
    [...]
    binaryfunc nb_true_divide; <-------
    [...]
} PyNumberMethods;

Вместо этого я попробовал nb_true_divide, и она тоже работает. В чем разница между всеми этими функциями и какую из них мне следует использовать, если я хочу поддерживать foo.vector() / 100.0

1 Ответ

2 голосов
/ 26 мая 2020

Там также np_floor_divide, которые, в качестве состояния документов:

Возвращает пол o1, разделенный на o2, или NULL при отказе. Это эквивалентно «классическому» делению целых чисел.

Это то, что было добавлено. Что касается различий, об этом уже спрашивали, например, см. здесь .

Вкратце, если вы хотите прикрепить поведение для вашего настраиваемого типа на основе используемого /, определите слот np_true_divide. Для // используйте np_floor_divide.

.
...