美文网首页
python修饰器

python修饰器

作者: AsdilFibrizo | 来源:发表于2019-08-21 22:13 被阅读0次
    • 介绍修饰器之前首先要介绍两个参数
    *args和**kwargs
    *args:是一个列表,传入的参数会被放进列表里
    **kwargs:是一个字典,传入的参数以键值对的形式存放到字典里
    
    def f(*args):
        print(args)
    f(1, 3, 5)
    [out]: (1, 3, 5)
    
    def f(**kwargs):
        print(kwargs)
    f(a=1,b=2,c =3)
    [out]: {'a': 1, 'b': 2, 'c': 3}
    
    • 基础用法
    import time
    def f():
        start = time.clock()
        print("ok")
        end = time.clock()
        print("start:", start, " end:", end)
    f()  
    若有其它函数想要计算运行时间,则这样写很麻烦,这里引入修饰器
    def runtime(func):
        def wrapper():
            start = time.clock()
            func()
            end = time.clock()
            print("start:", start, " end:", end)
        return wrapper
    @runtime
    def f():
        print("ok")
    f()
    
    • 传递参数
    # 将输出文件变为int
    def toint(func):
        def wrapper(*args, **kwargs):
            ret = func(*args, **kwargs)
            ret = list(map(int, ret))
            return ret
        return wrapper
    @toint
    def f(a, b):
        assert isinstance(a, list)
        assert isinstance(b, list)
        a.extend(b)
        return a
    print(f(['11','22','33'], [44,55,66]))
    [out]: [11, 22, 33, 44, 55, 66]
    

    *报错

    若要使用修饰器修函数结果进行断言则可以使用下面的语句
    def isint(func):
        def wrapper(*args, **kwargs):
            for each in args:
                assert isinstance(each, int), func.__name__ + '() 输出不为数字'
            for key in kwargs:
                assert isinstance(kwargs[key], int), func.__name__ + '() 输出不为数字'
            ret = func(*args, **kwargs)
            return ret
        # 将wrapper的docstring和名称设置成和原始函数一样,有利于内省(获得自身的信息)
        wrapper.__name__ = func.__name__
        wrapper.__doc__ = func.__doc__
        return wrapper
    @isint
    def f(a, b):
        return a+b
    print(f('2',2))
    [out]: AssertionError: f() 输出不为数字
    

    这个修饰器可以简化 functools已经封装好了

    import functools
    def isint(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            for each in args:
                assert isinstance(each, int), func.__name__ + '() 输出不为数字'
            for key in kwargs:
                assert isinstance(kwargs[key], int), func.__name__ + '() 输出不为数字'
            ret = func(*args, **kwargs)
            return ret
        return wrapper
    @isint
    def f(a, b):
        return a+b
    print(f('2',2))
    [out]: AssertionError: f() 输出不为数字
    

    相关文章

      网友评论

          本文标题:python修饰器

          本文链接:https://www.haomeiwen.com/subject/jxjwsctx.html