向 kwargs 添加参数时出错
Posted
技术标签:
【中文标题】向 kwargs 添加参数时出错【英文标题】:Getting an error when adding an argument to kwargs 【发布时间】: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)
【参考方案1】:
我不知道你为什么会这样——我无法在我的机器上重现它。
也就是说,做你想做的最简单的方法就是忘记 args 和 kwargs 的麻烦,然后去做
else:
return view(request, *args, status=status, **kwargs)
假设你知道 view
接受一个名为“状态”的参数。 (如果不是,正如 John Spong 所说,那是你的问题。)
Here's a bit more on *args, **kwargs, and **
in functions.
也就是说,您似乎只想检查用户是否通过了您的supercheck
函数。查看@user_passes_test
decorator - 它完全符合您的要求。
【讨论】:
问题是原始视图没有采用“状态”。这就是为什么我尝试将它包含在 kwargs 中,但它似乎不允许我 是的,你不能用 kwargs 做到这一点——你不能像那样随意传递参数。对不起!也就是说,有一种更简单的方法来做你想做的事——检查传入的编辑。【参考方案2】:呸,我想通了。结果我所要做的就是确保原始函数采用 *args 和 **kwargs,这更容易概括(因为我不知道这些函数会如何)
所以我的函数 update() 现在有了签名
update(request, extra=None, *args, **kwargs)
而且我可以在包装之前通过更新 kwargs 来传入“任意”关键字。感谢您的澄清。 cmets 帮助我缩小了问题的范围!
唯一需要注意的是,我在更新功能中使用
访问状态kwargs['status']
而不仅仅是
status
还不错
【讨论】:
以上是关于向 kwargs 添加参数时出错的主要内容,如果未能解决你的问题,请参考以下文章
__init__() 在使用 get_form_kwargs 时得到了一个意外的关键字参数