from icecream import ic
from functools import wraps
'''使用装饰器时,原函数会损失一些信息,因为指向装饰器中的函数。'''
def log(func):
"""定义一个闭包函数"""
def with_logging(*args, **kwargs):
"""打印"""
print(f'{func.__name__} was calling ')
return func(*args, **kwargs)
return with_logging
@log
# test = log(test)
def test(x):
"""求平方"""
return x*x
ic(log.__doc__) # 打印函数的文档信息(须双引号注释)
ic(test.__name__) # 打印函数名,test→log→with_logging
ic(test.__doc__)
ic(test(5))
'''通过导入import functools模块,在装饰器函数内部添加@functools.wraps(func),可以实现保存被装饰函数原信息。'''
def log2(func):
"""定义一个闭包函数"""
@wraps(func) # functools.wraps可以将原函数对象的指定属性复制给包装函数对象,默认有module、name、doc,或者通过参数选择使用
def with_logging2(*args, **kwargs):
"""打印"""
print(f'{func.__name__} was calling ')
return func(*args, **kwargs)
return with_logging2
@log2
# test2 = log2(test2)
def test2(x):
"""求平方"""
return x*x
ic(log2.__doc__) # 打印函数的文档信息(须双引号注释)
ic(test2.__name__) # 打印函数名,test→log→with_logging
ic(test2.__doc__)
ic(test2(5))
python中wraps的使用
最新推荐文章于 2025-03-26 17:26:38 发布