簡體   English   中英

在運行時將參數傳遞給裝飾器

[英]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是變量?

您可以使用類作為裝飾器,具有triesdelay實例變量:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM