Python装饰器19-wraps

回顾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__)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容