いくつかのパラメーターを検証し、検証されたキーをさまざまな関数に渡すデコレーターがあります。
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() を呼び出せるようにすることと、パラメーターが欠落している場合にのみデコレーターにパラメーターを生成させることです。
functools.wraps() がそれを隠しているように見えるため、これまでデコレータ内で「キー」パラメータが渡されたかどうかを判断する方法がわかりません。