[英]How to pass parameters to modify a decorator that takes a function with parameters
我必須創建一個具有參數的裝飾器,並使用這些參數來修改 function 也帶有參數。 這是一個關於如何使用帶有附加參數的參數來裝飾任何 function 的一般問題,但對於我的具體情況,我需要它用於 Django RQ,以根據環境變量確定是否使用通過裝飾器激活的異步隊列。
在 Django RQ 中有一個 function 名為django_rq.job
我這樣使用(它需要args
和kwargs
):
@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.