所以我有这组代码,测试装饰器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):
# ...