美文网首页
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