向 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 添加参数时出错的主要内容,如果未能解决你的问题,请参考以下文章

Python中*args和**kwargs 的简单使用

__init__() 在使用 get_form_kwargs 时得到了一个意外的关键字参数

Python的*args与**kwargs

python中*args 和**kwargs的用法

args 或 kwargs 是不是接受 python 参数的默认值? [复制]

(十五)python3 可变长参数(arg,*args,**kwargs)