Я хотел бы сделать:Можно ли перезаписать поведение str str с помощью __rmod__?
x %doSomething% y
, который достаточно легко сделать (см код ниже) для любых х и у любого, кроме как в случае, когда х является ул.
Есть ли какой-либо способ (например, добавление специального метода или повышение определенной ошибки), чтобы вызвать форматирование строки старого стиля (аналогично тому, как 1% doSomthing терпит неудачу с TypeError) и вернуться к методу __rmod__, определенному в doSomething объект?
class BinaryMessage(object):
def __init__(self, fn):
self._fn = fn
def __rmod__(self, LHS):
return BinaryMessagePartial(self._fn, LHS)
class BinaryMessagePartial(object):
def __init__(self, fn, LHS):
self._fn = fn
self._LHS = LHS
def __mod__(self, RHS):
return self._fn(self._LHS, RHS)
def _doSomething(a , b):
return a + b
doSomething = BinaryMessage(_doSomething)
result = 5 %doSomething% 6
assert result == 11
Чтобы уточнить: вы хотите '" foo "% doSomething%" bar "' возвращать '" foobar "'? Я считаю, что это невозможно, потому что 'str .__ mod__' вызывает' TypeError' вместо возврата 'NotImplemented'. – L3viathan
@MartijnPieters Я не вижу, что работаю с вашим ответом. Он работает для целых чисел и т. Д., Как в вопросе, но '' foo "% doSomething%" bar "' вызывает тот же TypeError. – L3viathan
@ L3viathan: Нет, я был здесь слишком далеко. На мой взгляд, это на самом деле ошибка в Python. –