Не удается получить доступ к аргументу ключевого слова украшенной функции внутри декоратора в Python 3 - PullRequest
0 голосов
/ 21 января 2019

kwargs пуст в следующем коде.Как получить доступ к ключевому слову arg оформленной функции?

import functools
def retriable(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        timeout = kwargs['timeout']
        criteria_satisfied = func(*args, **kwargs)
        while not criteria_satisfied and timeout > 0:
            time.sleep(5)
            timeout -= 5
            criteria_satisfied = func(*args, **kwargs)
        return criteria_satisfied
    return wrapper

@retriable
def decorated(ip, timeout=60):
    ... some logic
    return True 

decorated(ip)

1 Ответ

0 голосов
/ 22 января 2019

Решением было сделать декоратор с аргументами.Который вернул бы другой декоратор над функцией и заполнил бы созданное замыкание значением аргумента.

import functools
def retriable_with_arg(timeout):
    def retriable(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            alive_timeout = timeout
            criteria_satisfied = func(*args, **kwargs)
            while not criteria_satisfied and alive_timeout > 0:
                time.sleep(5)
                alive_timeout -= 5
                criteria_satisfied = func(*args, **kwargs)
            return criteria_satisfied
     return wrapper
return retriable

@retriable(timeout=60)
def decorated(ip, timeout=60):
    ... some logic
    return True 

decorated(ip)
...