日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

是否使用wraps的區別

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 是否使用wraps的區別 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一次見到functools.wraps是在?Flask Web開發?中,一直不明白怎么回事。

  裝飾器(decorator)是干嘛的?對于受到封裝的原函數來說,裝飾器能夠在那個函數執行前或者執行后分別運行一些代碼,使得可以再裝飾器里面訪問并修改原函數的參數以及返回值,以實現約束定義、調試程序、注冊函數等目標。裝飾器一般返回一個包裝器(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)

輸出結果:

?

?

可以看到,裝飾器完全可以正常工作。。。

但是,函數的名字變成裝飾器中的包裝器了!!!help內置函數也失效了

也就是說,原函數的屬性失效了

如果想要保留原函數的屬性,就可以用到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)

輸出結果:

?一句話總結:使用wraps可以避免破壞被裝飾的函數中的屬性。

?

參考資料:Effective Python,第6章 內置模塊


總結

以上是生活随笔為你收集整理的是否使用wraps的區別的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。