繁体   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