[英]How parameters pass in decorator of python?
def require(role):
def wrapper(fn):
def new_fn(*args, **kwargs):
if not role in kwargs.get('roles', []):
print("%s not in %s" % (role, kwargs.get('roles', [])))
raise Exception("Unauthorized")
return fn(*args, **kwargs)
return new_fn
return wrapper
@require('admin')
def get_users(**kwargs):
return ('Alice', 'Bob')
上面的代码使用admin
参数化了装饰器require
参数。 函数get_users
似乎传递给wrapper
的参数fn
。 但是, get_users
如何传递给参数fn
?
这里的get_users()
没有传递参数fn
由于函数get_users()
已绑定到装饰器require
因此首先调用装饰器,同时将您的get_users()
对象/引用作为参数传递
当在另一个函数中定义一个函数时(如此处所示)(实际上,这里有两个级别),内部函数可以访问所有外部函数的变量。 因此,没有必要将role
或fn
显式传递给内部函数。
这是正在发生的事情:
role
设置为"admin"
调用require()
。 require()
函数定义了另一个函数wrapper()
,该函数将返回该函数。 (顺便说一句,此函数的名称并不好:它是进行包装的函数,而不是实际上充当包装器的函数。它可能应该称为wrap()
或decorate()
。) wrapper()
传递给函数get_users()
。 wrapper()
创建一个新函数new_fn()
,以代替 get_users()
进行调用,并返回new_fn()
。 (同样,这不是最伟大的名称,应该将其称为wrapper()
因为它是装饰函数的包装器。) 现在,由于上述情况,内部函数可以访问所有外部函数的变量(称为“关闭”),因此new_fn()
可以访问fn
,这是它包装的函数( get_users()
)和最初传递给require()
role
参数。 因此,它可以检查用户的角色,以查看是否允许该用户调用该函数,然后,如果允许,则调用该函数并返回结果,从而代替get_users()
,并在原始函数周围附加功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.