Есть ли в стандартной библиотеке Python ярлык для написания декораторов, принимающих аргументы?
Например, если я хочу написать такой декоратор, как with_timeout(timeout)
:
@with_timeout(10.0)
def cook_eggs(eggs):
while not eggs.are_done():
eggs.cook()
, я должен написать что-то вроде:
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
Но это ужасно многословно. Есть ли ярлык, облегчающий написание декораторов, принимающих аргументы?
Примечание: я понимаю, что можно также использовать три вложенные функции для реализации декораторов с аргументами… Но это тоже кажется немного неоптимальным.
Например, возможно что-то вроде функции @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