У меня есть декоратор, который проверяет некоторые параметры и передает проверенный ключ к различным функциям:Как изменить параметры, хранящиеся в functools.wraps?
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(), похоже, скрывает его.
Почему вы говорите 'f unctools.wrap скрывает его? '' key "' заканчивается прямо там, в 'args', поэтому вы можете сделать' if len (args) == 0: ... '. Проблема в том, что он не знает, что такое позиция «ключ»? –
Положите по-другому: какое поведение отличается, когда включена строка 'wraps (f)', а не когда это не так? –
Да, этот декоратор используется для ряда функций, где «ключ» находится в разных положениях. – dragonx