【发布时间】:2013-11-12 04:24:43
【问题描述】:
所以我正在尝试为我的 django 视图制作一个装饰器,并且它可以正常工作。装饰器看起来像
# Decorator for the function - update(request, extra=None)
def check_super(view):
def wrapper(request, *args, **kwargs):
status = supercheck(request)
if status=="USER":
raise PermissionDenied
else:
args = [a for a in args]
kwargs = dict((k, v) for k, v in kwargs.items())
kwargs.update({'status':status}) # Offending line
return view(request, *args, **kwargs)
return wrapper
基本上,我使用 supercheck 函数进行检查,我想将其结果作为另一个参数传递给我的函数,但上述行导致错误
update() got an unexpected keyword argument 'status'
kwargs 只是一本字典,对吧?所以我应该能够像这样向它添加新的绑定,但它一直给我这个错误。这样做也会导致同样的错误
kwargs['status']=status
【问题讨论】:
-
您要包装的函数是否也称为“更新”。我认为违规行是您在已标记的行下方调用 view() 的位置。第一行注释中的“更新”功能不接受名为“状态”的 kwarg
-
是的,我包装的函数叫做更新。我认为像我在 wrapper() 的 return 语句中所做的那样传递 kwargs 的全部意义在于我可以向它添加任意参数
-
函数
f(**kwargs)可以接受任意数量的关键字参数,但update(extra=None)只需要一个关键字参数。 -
或许可以试试 rw_kwargs = copy.copy(kwargs)
标签: python django keyword-argument python-decorators