zoukankan      html  css  js  c++  java
  • [python 基础]python装饰器(二)带参数的装饰器以及inspect.getcallargs分析

    带参数的装饰器理解无非记住两点:

    1.本质不过在基本的装饰器外面再封装一层带参数的函数

    2.在使用装饰器语法糖的时候与普通装饰器不同,必须要加()调用,且()内的内容可以省略(当省略时,admin默认为函数is_admin声明时变量"admin")

    import functools
    
    def is_admin(admin="admin"):
        def decorated(func):
            @functools.wraps(func)
            def wrapper(*args,**kwargs):
                if kwargs.get("username")!=admin:
                    raise Exception("this user is not allowed to get food")
                result = func(*args,**kwargs)
                return result
            return wrapper
        return decorated
    
    @is_admin(admin="root")#这里也可以@is_admin() 此时admin默认为函数声明时定义的"admin"
    def barfoo(username="someone"):
        """do crazy stuff"""
        print("%s get food" % (username))
    
    
    if __name__=="__main__":
        barfoo(username="root")#这里调用的时候必须加上形参的名字

    [注意] 如果main中调用 barfoo时不想带形参,可以使用inspect模块的getcallargs方法,该方法返回一个将参数名字和值作为键值对的字典(按照形参和实际传入参数的位置形成键值对)

    代码如下:

    import functools
    import inspect
    
    def is_admin(admin="admin"):
        def decorated(func):
            @functools.wraps(func)
            def wrapper(*args,**kwargs):
                func_args = inspect.getcallargs(func,*args,**kwargs)
                if func_args.get("username")!=admin :
                    raise Exception("this user is not allowed to get food")
                result = func(*args,**kwargs)
                return result
            return wrapper
        return decorated
    
    @is_admin("admin")
    def barfoo(username="someone"):
        """do crazy stuff"""
        print("%s get food" % (username))
    
    
    if __name__=="__main__":
        barfoo("admin")

    上述两块代码结果都为:

      admin get food

  • 相关阅读:
    pytorch_wavelets包实现的小波变换和MWCNN中的小波变换的异同点
    servlet的xx方式传值中文乱码
    类中添加log4j日志
    QueryRunner实战(query_update)、BeanListBeanHandler、MapListMapHandler、ScalarHandler
    java中常用jar包
    QueryRunner类实战
    Json解析包FastJson使用
    BaseDAO使用
    策略模式
    关于动态代理
  • 原文地址:https://www.cnblogs.com/halleluyah/p/8867461.html
Copyright © 2011-2022 走看看