Вы можете использовать модуль wrapt
.
Имейте в виду, что декораторы wrapt
имеют интерфейс, отличный от стандартных декораторов python.Я настоятельно рекомендую прочитать документацию wrapt
.В любом случае, вот базовая реализация вашего декоратора с wrapt.decorator
:
import wrapt
def args_as_ints(f):
time.sleep(1) # hard at work
@wrapt.decorator
def g(f, instance, *args, **kwargs):
args = [int(x) for x in args]
kwargs = dict((k, int(v)) for k, v in kwargs.items())
return f(*args, **kwargs)
return g(f) # apply the decorator to the function
Обратите внимание, что моя реализация полностью игнорирует аргумент instance
, поэтому он не будет работать правильно для методов экземпляра.
Однако он поддерживает подпись оформленной функции:
Help on function funny_function in module __main__:
funny_function(x, y, z=3)
Computes x*y + 2*z