Имеется ли в стандартной библиотеке Python ярлык для написания декораторов, которые принимают аргументы?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
Если вам нужна дополнительная помощь декораторы и аннотации см. мой блог. http://blog.mattalcock.com/2013/1/5/decorates-and-annotations/ –