[英]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.