python在带有kwarg的类中使用self-in-decorators



所以我有这组代码,测试装饰器base_permissions_check:

def authenticated(self,*arg,**kwargs):
    function_call = inspect.stack()[1][4][0].strip()
    matched = re.match('^self.', function_call)
    if not matched:
        raise Exception("function is private")
    return self.user.is_authenticated()
def base_permissions_check(func):
    def wrap(self,**kwargs):
        if not self.authenticated(kwargs):
            return self.permissions
            # func(kwargs)
        return func(kwargs)
    return wrap
#public
@base_permissions_check
def has_video_permission(self,**kwargs):

当我调用has_video_permission时,错误显示为authenticated() takes 1 positional argument but 2 were given。我真的不知道怎么了?而我只将一个kwarg传递给它

封装的func()函数没有作为方法绑定到实例,因此需要显式传入self。您还需要使用**kwargs调用语法将kwargs字典作为单独的关键字参数应用:

return func(self, **kwargs)

您的authenticated方法实际上并不是使用您传入的kwargs字典,所以您可以直接调用self.authenticated(),但如果您需要访问这些关键字参数,您可能也希望在那里使用**kwargs调用语法:

if not self.authenticated(**kwargs):

由于在调用装饰函数时看到错误,因此可能传入了位置参数,但包装器只接受关键字参数(超出self)。也许您想添加*args来处理这些位置参数:

def base_permissions_check(func):
    def wrap(self, *args, **kwargs):
        if not self.authenticated(**kwargs):
            return self.permissions
            # func(kwargs)
        return func(self, *args, **kwargs)
    return wrap
#public
@base_permissions_check
def has_video_permission(self, *args, **kwargs):
    # ...

最新更新