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

  • 相关阅读:
    中标麒麟QT5编译出现:cannot find -lGL 和 collect2:error:ld returned 1 exit status 错误
    虚拟机设置静态ip【实测中标麒麟】
    selenium webdriver如何拿到页面的加载时间
    有感于去哪儿的一道笔试题
    python selenium 常见问题列表
    乙醇的webdriver实用指南java版本
    乙醇的webdriver实用指南ruby版本
    作死的自动化测试
    从龙门镖局看自动化测试
    无用的自动化测试
  • 原文地址:https://www.cnblogs.com/halleluyah/p/8867461.html
Copyright © 2011-2022 走看看