美文网首页
Python装饰器19-wraps

Python装饰器19-wraps

作者: dnsir | 来源:发表于2019-07-15 21:43 被阅读0次

    回顾Python装饰器使用

    from functools import wraps
    
    def dec(f):
        def wrapper(*args, **kwargs):
            'wrapper doc'
            print('wrapper')
            return f(*args, **kwargs)
        return wrapper
    
    @dec
    def add(x, y):
        'original add'
        return x + y
    
    print(add(3,3))
    print(add)
    print(add.__name__)
    print(add.__doc__)
    

    输出结果:

    wrapper
    6
    <function dec.<locals>.wrapper at 0x7fd3b6bed0d0>
    wrapper
    wrapper doc

    发现函数add经过装饰器(wrapper)之后函数的属性发生变化如函数名和__doc__,这不是期望的结果。

    wraps解决函数签名问题

    Python提供了functools来解决该问题,代码如下:

    from functools import wraps
    
    def dec(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            'wrapper doc'
            print('wrapper')
            return f(*args, **kwargs)
        return wrapper
    
    @dec
    def add(x, y):
        'original add'
        return x + y
    
    print(add(3,3))
    print(add)
    print(add.__name__)
    print(add.__doc__)
    

    输出结果:

    wrapper
    6
    <function add at 0x7fb18832c0d0>
    add
    original add

    发现经过装饰之后的函数属性跟装饰之前的函数一样。

    如何获取装饰之前的函数

    当需要获取装饰之前的函数相关性质时,Python也提供了类似的功能,可以使用__wrapped__属性。

    print(add.__wrapped__)
    print(add.__wrapped__.__doc__)
    print(add.__wrapped__.__name__)
    

    相关文章

      网友评论

          本文标题:Python装饰器19-wraps

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