Chciałbym zrobić:Czy można zastąpić zachowanie%% za pomocą __rmod__?
x %doSomething% y
co jest dość łatwe do zrobienia (patrz poniższy kod) dla dowolnego x i y dowolnej wyjątkiem, że X jest ul.
Czy jest jakiś sposób (np. Dodanie specjalnej metody lub podniesienie określonego błędu), aby spowodować, że formatowanie starego stylu zakończy się niepowodzeniem (podobnie jak 1% DoSomthing kończy się niepowodzeniem z TypeError) i powrócić do metody __rmod__ zdefiniowanej w doSomething obiekt?
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
Aby wyjaśnić: Chcesz '" foo "% doSomething%" pasek "', aby zwrócić '" foobar "'? Wierzę, że to niemożliwe, ponieważ 'str .__ mod__' podnosi' TypeError' zamiast zwracania 'NotImplemented'. – L3viathan
@MartijnPieters Nie widzę, żeby to działało z twoją odpowiedzią. Działa na liczbach całkowitych itp., Jak w pytaniu, ale '' foo "% doSomething%" bar "' podnosi ten sam TypeError. – L3viathan
@ L3viathan: nie, byłem tu trochę za daleko. W rzeczywistości jest to błąd w Pythonie. –