您好,登錄后才能下訂單哦!
Python內置的wraps裝飾器的作用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Python裝飾器(decorator)在實現的時候,被裝飾后的函數其實已經是另外一個函數了(函數名等函數屬性會發生改變),為了不影響,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。寫一個decorator的時候,最好在實現之前加上functools的wrap,它能保留原有函數的名稱和docstring。
wraps內置方法的作用
查看一個函數的幫助文檔有兩種方法:
func_name.__doc__ help(func_name)
先來看一個例子,定義timmer裝飾器和index函數,并且都添加了幫助文檔。
import time def timmer(func): def inner(*args,**kwargs): 'wrapper inner function' start_time=time.time() res=func(*args,**kwargs) end_time=time.time() print("run time: %s " %(end_time-start_time)) return res return inner def index(): 'index function' time.sleep(2) print("welcome to index page")
在index沒有被timmer裝飾前,來查看index的幫助文檔:
print(index.__doc__)
程序運行結果:
index function
然后為index添加timmer裝飾器,再次查看index函數的幫助文檔:
import time def timmer(func): def inner(*args,**kwargs): 'wrapper inner function' start_time=time.time() res=func(*args,**kwargs) end_time=time.time() print("run time: %s " %(end_time-start_time)) return res return inner @timmer def index(): 'index function' time.sleep(2) print("welcome to index page") print(index.__doc__)
程序運行結果:
wrapper inner function
可以看到,在為index函數添加裝飾器后,index函數的幫助文檔變成裝飾器timmer內部函數的幫助文檔了。
換句話說,就是原始index函數內部的數據被裝飾器timmer修改了。
怎么樣才能在保留原始被裝飾函數的數據的前提下,為函數添加新功能呢??就是python內置的wraps裝飾器。
導入wraps裝飾器,修改上面的代碼,為timmer的內部函數添加wraps裝飾器,然后再次查看被裝飾函數的幫助文檔:
import time from functools import wraps def timmer(func): @wraps(func) def inner(*args,**kwargs): 'wrapper inner function' start_time=time.time() res=func(*args,**kwargs) end_time=time.time() print("run time: %s " %(end_time-start_time)) return res return inner @timmer def index(): 'index function' time.sleep(2) print("welcome to index page") print(index.__doc__)
運行程序,執行結果如下:
index function
可以看到,index函數即使添加了裝飾器,其內部的原始數據仍然沒有被裝飾器修改。
從上面的示例可以看出,wraps裝飾器的作用就是保留被裝飾對象的原始數據信息。
實例一:
不加wraps
# -*- coding=utf-8 -*- from functools import wraps def my_decorator(func): def wrapper(*args, **kwargs): '''decorator''' print('Calling decorated function...') return func(*args, **kwargs) return wrapper @my_decorator def example(): """Docstring""" print('Called example function') print(example.__name__, example.__doc__)
執行結果:
('wrapper', 'decorator')
實例二:
加wraps
# -*- coding=utf-8 -*- from functools import wraps def my_decorator(func): @wraps(func) def wrapper(*args, **kwargs): '''decorator''' print('Calling decorated function...') return func(*args, **kwargs) return wrapper @my_decorator def example(): """Docstring""" print('Called example function') print(example.__name__, example.__doc__)
執行結果:
('example', 'Docstring')
總結:
warps 作用: 消除(被裝飾后的函數名等屬性的改變)副作用。
關于Python內置的wraps裝飾器的作用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。