繁体   English   中英

参数如何在python装饰器中传递?

[英]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()对象/引用作为参数传递

有关详细信息,请参阅https://wiki.python.org/moin/PythonDecorators

当在另一个函数中定义一个函数时(如此处所示)(实际上,这里有两个级别),内部函数可以访问所有外部函数的变量。 因此,没有必要将rolefn显式传递给内部函数。

这是正在发生的事情:

  1. 使用role设置为"admin"调用require()
  2. require()函数定义了另一个函数wrapper() ,该函数将返回该函数。 (顺便说一句,此函数的名称并不好:它是进行包装的函数,而不是实际上充当包装器的函数。它可能应该称为wrap()decorate() 。)
  3. wrapper()传递给函数get_users()
  4. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM