是否使用wraps的區別
生活随笔
收集整理的這篇文章主要介紹了
是否使用wraps的區別
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
第一次見到functools.wraps是在?Flask Web開發(fā)?中,一直不明白怎么回事。
裝飾器(decorator)是干嘛的?對于受到封裝的原函數(shù)來說,裝飾器能夠在那個函數(shù)執(zhí)行前或者執(zhí)行后分別運行一些代碼,使得可以再裝飾器里面訪問并修改原函數(shù)的參數(shù)以及返回值,以實現(xiàn)約束定義、調(diào)試程序、注冊函數(shù)等目標(biāo)。裝飾器一般返回一個包裝器(wrapper),而functools.wraps就是裝飾包裝器的裝飾器。
先來看一個不使用functools.wraps的裝飾器例子。
def tracer(func):def wrapper(*args, **kwargs):result = func(*args, **kwargs)print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result))return resultreturn wrapper@tracer def fibonacci(n):if n in (0,1):return nreturn (fibonacci(n-1)+fibonacci(n-2))fibonacci(3) print(fibonacci) print('help:') help(fibonacci)輸出結(jié)果:
?
?
可以看到,裝飾器完全可以正常工作。。。
但是,函數(shù)的名字變成裝飾器中的包裝器了!!!help內(nèi)置函數(shù)也失效了
也就是說,原函數(shù)的屬性失效了
如果想要保留原函數(shù)的屬性,就可以用到functools.wraps了
1 from functools import wraps 2 def tracer(func): 3 @wraps(func) 4 def wrapper(*args, **kwargs): 5 result = func(*args, **kwargs) 6 print('%s(%r,%r)->%r'%(func.__name__,args,kwargs,result)) 7 return result 8 return wrapper 9 10 @tracer 11 def fibonacci(n): 12 if n in (0,1): 13 return n 14 return (fibonacci(n-1)+fibonacci(n-2)) 15 16 17 fibonacci(3) 18 print(fibonacci) 19 print('help:') 20 help(fibonacci)輸出結(jié)果:
?一句話總結(jié):使用wraps可以避免破壞被裝飾的函數(shù)中的屬性。
?
參考資料:Effective Python,第6章 內(nèi)置模塊
總結(jié)
以上是生活随笔為你收集整理的是否使用wraps的區別的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu突然连不上-调试方式
- 下一篇: python调用stanfordNLP的