¿La biblioteca estándar de Python tiene un atajo para escribir decoradores que aceptan argumentos?Python: atajo para escribir decoradores que aceptan argumentos?
Por ejemplo, si quiero escribir un decorador como with_timeout(timeout)
:
@with_timeout(10.0)
def cook_eggs(eggs):
while not eggs.are_done():
eggs.cook()
tengo que escribir algo como:
def with_timeout(timeout):
_func = [None]
def with_timeout_helper(*args, **kwargs):
with Timeout(timeout):
return _func[0](*args, **kwargs)
def with_timeout_return(f):
return functools.wraps(f)(with_timeout_helper)
return with_timeout_return
Pero eso es muy detallado. ¿Hay un atajo que haga que los decoradores que aceptan argumentos sean más fáciles de escribir?
Nota: Me doy cuenta de que también es posible utilizar tres funciones anidadas para implementar decoradores con argumentos ... Pero eso también se siente un poco subóptimo.
Por ejemplo, posiblemente, algo así como una función @decorator_with_arguments
:
@decorator_with_arguments
def timeout(f, timeout):
@functools.wraps(f)
def timeout_helper(*args, **kwargs):
with Timeout(timeout):
return f(*args, **kwargs)
return timeout_helper
Si necesita más ayuda con decoradores y anotaciones, vea la publicación de mi blog aquí. http://blog.mattalcock.com/2013/1/5/decorates-and-annotations/ –