python wraps模块_编写高质量Python代码的59个有效方法 第6章 内置模块 第42条:用functools.wraps装饰wrapper装饰器...

调试递归函数时我们常需要打印出每一步的参数及返回值,这时写个装饰器十分高效:

def trace(func):

def wrapper(*args, **kw):

result = func(*args, **kw)

print(f"{func.__name__}({args}, {kw}) --> {result}")

return result

return wrapper

@trace

def fibonacci(n):

if n in (0, ):

return 0

return fibonacci(n-1) + fibonacci(n-2)

fibonacci(4)

>>>

fibonacci((1,), {}) --> 0

fibonacci((0,), {}) --> 0

fibonacci((2,), {}) --> 0

fibonacci((1,), {}) --> 0

fibonacci((3,), {}) --> 0

这种写法的缺陷在于变量fibonacci变成了wrapper:

help(fibonacci)

>>>

Help on function wrapper in module __main__:

wrapper(**args, **kwargs)

print(fibonacci)

>>>

.wrapper at 0x0000012B1C774598>

为了维护函数的接口,修饰后的函数,必须保留原函数的某些标准python属性,例如,__name__,__module__。因此我们需要wraps来装饰wrapper:

from functools import wraps

def trace(func):

@wraps

def wrapper(*args, **kw):

result = func(*args, **kw)

print(f"{func.__name__}({args}, {kw}) --> {result}")

return result

return wrapper

要点

内置的functools模块提供了名为wraps的装饰器,开发者定义自己的装饰器时,应用wraps对其做一些处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值