Не удается получить доступ к аргументу ключевого слова украшенной функции внутри декоратора в Python 3
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 ответ
Решением было сделать декоратор с аргументами. Который вернул бы другой декоратор над функцией и заполнил бы созданное замыкание значением аргумента.
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)