[英]Passing parameters to decorator at runtime
如果我像這樣創建一個python decorator函數
def retry_until_true(tries, delay=60):
"""
Decorator to rety a function or method until it returns True.
"""
def deco_retry(f):
def f_retry(*args, **kwargs):
mtries = tries
rv = f(*args, **kwargs)
while mtries > 0:
if rv is True:
return True
mtries -= 1
time.sleep(delay)
rv = f(*args, **kwargs)
return False
return f_retry
return deco_retry
我可以像這樣使用它
@retry_until_true(20, delay=30)
def check_something_function(x, y):
...
return True
但有沒有辦法在運行時將“嘗試”和“延遲”的不同值傳遞給裝飾器,以便20和30是變量?
您可以使用類作為裝飾器,具有tries
和delay
實例變量:
class RetryUntilTrue(object):
def __init__(self, f=None, tries=10, delay=30):
self.f = f
self.tries = tries
self.delay = delay
def __call__(self, *args, **kwargs):
if self.f is None:
self.f = args[0]
else:
tries = self.tries
while tries:
if self.f(*args, **kwargs):
return True
tries -= 1
time.sleep(self.delay)
用法:
@RetryUntilTrue
def foo(x):
pass
foo.tries = 20
foo.delay = 1
@RetryUntilTrue(tries=100, delay=9999)
def bar(x):
pass
bar.tries -= 1
bar.delay = foo.delay
當然可以,只需將函數定義嵌套在另一個函數中,例如:
def explicit_setup_func(tries, delay=60):
@retry_until_true(tries, delay)
def check_something_function(x, y):
# Code
但是,類裝飾器解決方案更實用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.