0

我有一些具有属性的方法(使用 .Net 术语)。就像是。

#Example Usage
@RequireLoggedIn
def SomeAuthorisedFunction():
    # ...

该属性定义为

def RequireLoggedIn(func):
    func.AuthenticationRequired = True
    return func

然后我可以检查是否已使用hasattr(view_func, 'AuthenticationRequired'). 我想做的是这样的......

@RequireRole('Administrator')
def SomeAuthorisedFunction():
    # ...

我试过定义这样的属性:

def RequireRole(func, Role):
    func.RequiresRole = Role
    return func

@RequireRole('Administrator')结果missing positional argument "Role"@RequireRole(Role='Administrator')结果missing positional argument "func"

如何指定属性的属性?

4

2 回答 2

3

您需要创建一个嵌套函数;该RequireRole函数应返回实际的装饰器函数:

def RequireRole(Role):
    def decorator(func):
        func.RequiresRole = Role
        return func
    return decorator

@expression语法无非就是语法糖,如下设置:

@decorator
def foo(): pass

被翻译成:

def foo(): pass
foo = decorator(foo)

反而。但是这个decorator部分本身也可以是一个表达;这就是您尝试使用它的方式。所以当你@RequireRole('Administrator')用作装饰器时,你真的是这样做的:

def SomeAuthorisedFunction():
    # ...
SomeAuthorisedFunction = RequireRole('Administrator')(SomeAuthorisedFunction)

注意那里的双重函数调用!这就是我的版本RequireRole()返回嵌套函数的原因。应用它时会发生以下情况:

  1. def SomeAuthorizedFunction(): functionbody被执行。
  2. RequireRole('Administrator') is executed. It returns a scoped装饰器()`函数。
  3. 这个返回的函数被调用并传入SomeAuthorizedFunction步骤 1 中的函数。
  4. 作用域decorator()函数将.RequiresRole属性添加到函数中,并在步骤 2 中Role传入作用域值RequireRole。函数被返回。
  5. Python 将第 4 步的返回值赋给 name SomeAuthorizedFunction
于 2013-04-17T15:54:54.960 回答
1

您的RequireRole函数必须返回一个装饰器函数。这可以通过嵌套函数轻松完成,如下所示:

>>> def RequireRole(role):
...   def RequireRole(func):
...     func.RequiresRole = role
...     return func
...   return RequireRole
... 
>>> @RequireRole('Administrator')
... def SomeAuthorisedFunction():
...   pass
... 
>>> print SomeAuthorisedFunction.RequiresRole
Administrator
>>> 
于 2013-04-17T15:53:41.500 回答