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
9
задан David Wolever 16 May 2012 в 02:32
поделиться