python装饰器如何解决元信息丢失?

python装饰器如何解决元信息丢失?
python装饰器如何解决元信息丢失?

1、问题

使用装饰器可以大幅度提高代码的复用性,但是缺点就是原函数的元信息丢失了。

# 装饰器
def logged(func):
    def logging(*args, **kwargs):
        print(func.__name__)
        print(func.__doc__)
        func(*args, **kwargs)
    return logging
 
# 函数
@logged
def f(x):
    """函数文档,说明"""
    return x * x
 
print(f.__name__) # 输出 logging
print(f.__doc__) # 输出 None

2、解决办法非常简单,导入 from functools import wraps ,修改代码为下述内容:

from functools import wraps
# 装饰器
def logged(func):
    @wraps(func)
    def logging(*args, **kwargs):
        print(func.__name__)
        print(func.__doc__)
        func(*args, **kwargs)
    return logging
 
# 函数
@logged
def f(x):
    """函数文档,说明"""
    return x * x
 
print(f.__name__) # 输出 f
print(f.__doc__)  # 输出 函数文档,说明

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注