我有一个装饰器,它验证一些参数并将经过验证的密钥传递给各种函数:
from functools import wraps
ref validate(f):
@wraps(f) # This is to ensure docstrings are passed through the decorated function
def redirect_if_invalid(request, *args, **kwargs):
if request.valid == False:
return HttpResponseRedirect('/login')
else:
newkwargs = { 'key': request.key }
return f(request, *args, **newkwargs)
return redirect_if_invalid
这被其他一些功能使用:
@validate
def genericHandler(request, key)
pass
我会这样调用函数:
genericHandler(request)
装饰器生成“关键”kwarg。但是,我想有选择地在其他时候传入密钥,即调用:
genericHandler(request, 'keydata')
目前这给了我一个错误:
TypeError: genericHandler() got multiple values for keyword argument 'key'
我怎样才能解决这个问题?重申一下,主要目标是能够在有或没有可选参数的情况下调用 genericHandler(),并且只有在缺少参数时才让装饰器生成参数。
到目前为止,在装饰器内部,我无法弄清楚如何确定是否传入了“key”参数,因为 functools.wraps() 似乎隐藏了它。