Предположим, что у меня есть класс 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
?)
Большинство методов магического оператора приходят в двух вариантах: простой вариант и вариант с префиксом r
(пример __add__()
и __radd()__
). Если вы попытаетесь добавить объекты a
типа a
и b
типа b
, Python сначала вызовет A.__add__(a, b)
. Если это возвращает специальное значение NotImplemented
, вызывается B.__radd__(b, a)
.
Оба этих магических метода соответствуют operator.add
в модуле operator
. Точно так же магические методы __floordiv__()
и __rfloordiv__()
соответствуют operator.floordiv
.