Python装饰器19-wraps

2019-07-15  本文已影响0人  dnsir

回顾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__)
上一篇 下一篇

猜你喜欢

热点阅读