簡體   English   中英

如何傳遞參數來修改帶有參數的 function 的裝飾器

[英]How to pass parameters to modify a decorator that takes a function with parameters

我必須創建一個具有參數的裝飾器,並使用這些參數來修改 function 也帶有參數。 這是一個關於如何使用帶有附加參數的參數來裝飾任何 function 的一般問題,但對於我的具體情況,我需要它用於 Django RQ,以根據環境變量確定是否使用通過裝飾器激活的異步隊列。

在 Django RQ 中有一個 function 名為django_rq.job我這樣使用(它需要argskwargs ):

@django_rq.job('default', timeout=3600, result_ttl=86400)
def upload_missing_documents_s3(batches, projects, uuid_val):
   pass

# A simpler example:
@django_rq.job('default', timeout=3600, result_ttl=86400)
def sample(content):
    file = open("temp/sample.txt", "w+")
    file.write(content)
    file.close()

我需要創建一個裝飾器,它將采用 boolean 值並返回修改后的 function(有工作)或未修改的 function(無工作) 但我似乎無法弄清楚,因為有兩組參數。 我試過這樣的事情:

#My attempt, I don't think it works...
def conditional_django_job(function_name, *args, **kwargs):
    if settings.NO_QUEUE:
        return function_name
    else:
        return django_rq.job("default", None, *args, **kwargs)(function_name)

@conditional_django_job('default', timeout=3600, result_ttl=86400)
def sample(content):
    file = open("temp/sample.txt", "w+")
    file.write(content)
    file.close()

我也嘗試過使用內部 function,但我似乎無法做到正確。 如何使用裝飾 function 的參數實現裝飾器?

我嘗試查看這個 SO question,但似乎沒有一個示例,其中裝飾器和 function 都有參數: 如何制作 function 裝飾器並將它們鏈接在一起?

謝謝!

嗯,我想我過了一段時間就明白了。 瘋狂地寫出一個問題可以幫助回答這個問題。

我認為這是解決方案:

def conditional_django_job(*args, **kwargs):
    def real_decorator(func):
        try:
            if settings.NO_QUEUE:
                print("Returning ordinary func")
                return func
            else:
                print("Returning queued func")
                return django_rq.job(*args, **kwargs)(func)
        except:
            print("Put NO_QUEUE boolean in env variable. Returning ordinary func")
            return func
    return real_decorator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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