向kwargs添加参数时出错

时间:2013-11-01 00:11:45

标签: python django kwargs python-decorators

所以我正在尝试为我的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

2 个答案:

答案 0 :(得分:2)

我不知道你为什么会这样 - 我无法在我的机器上重现它。

那就是说,做你想做的最简单的方法就是忘记与args和kwargs的混乱,然后做

else:
    return view(request, *args, status=status, **kwargs)

假设您知道 view接受一个名为'status'的参数。 (如果没有,正如John Spong说的那样,那就是你的问题。)

Here's a bit more on *args, **kwargs, and ** in functions.

也就是说,看起来您要做的就是检查用户是否通过了supercheck功能。查看@user_passes_test decorator - 它完全符合您的要求。

答案 1 :(得分:0)

巴哈,我明白了。事实证明我所要做的就是确保原始函数采用* args和** kwargs,这更容易概括(因为我不知道这些函数将如何)

所以我的函数update()现在有了签名

update(request, extra=None, *args, **kwargs)

我可以通过在换行之前更新kwargs来传递“任意”关键字。谢谢你的澄清。这些评论帮助我缩小了问题的范围!

唯一需要注意的是我使用

访问更新功能中的状态
kwargs['status'] 

而不仅仅是

status

哪个不太糟糕