Модуль `operator` в python не имеет` rfloordiv`? - PullRequest
1 голос
/ 25 апреля 2011

Предположим, у меня есть класс s, в котором есть члены op, left, right (это вопрос, связанный с Как назначить операцию, такую ​​как сумма или замена и т. Д., Переменной )Итак, в 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 функция?)

1 Ответ

4 голосов
/ 25 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...