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