Модуль `operator` в python не имеет` rfloordiv`?

1

Предположим, что у меня есть класс s, у которого есть члены op, left, right (это связанный вопрос с Как назначить операцию, такую ​​как sum или replace, и т.д.., к переменной). Итак, в op я храню оператор, например - operator.add, operator.radd и т.д. Но я хочу сохранить operator.rfloordiv и нет такого члена в этом классе?:\Но я может перегружать __rfloordiv__, поэтому он делает вообще.

Идея заключается в применении op к left и right при необходимости.

Мой подход выглядит следующим образом: сохраните некоторую специальную строку в моем op, а затем перед применением op, чтобы проверить, является ли op строкой. Если да, напишите уродливый оператор if-else, чтобы проверить все - rfloordiv, rmod, rtruediv. Если нет - просто примените op к обоим параметрам. Но это чертовски уродливо.

Есть ли лучший способ достичь этого?

Я знаю, что это можно сделать с помощью функции lambda, но если я это сделаю, есть ли способ увидеть, что это за функция lambda (на данный момент, когда мне нужно увидеть, что есть op, я проверяю его в выражении if следующим образом: if self.op is operator.radd: .., но что, если op есть функция lambda?)

Теги:
operator-overloading

1 ответ

4
Лучший ответ

Большинство методов магического оператора приходят в двух вариантах: простой вариант и вариант с префиксом r (пример __add__() и __radd()__). Если вы попытаетесь добавить объекты a типа a и b типа b, Python сначала вызовет A.__add__(a, b). Если это возвращает специальное значение NotImplemented, вызывается B.__radd__(b, a).

Оба этих магических метода соответствуют operator.add в модуле operator. Точно так же магические методы __floordiv__() и __rfloordiv__() соответствуют operator.floordiv.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню