你可能在隨意的 Python 代碼中見過這個 @wraps 的東西,你可能想知道這到底是什么?
元數據指的是函數本身的數據。
def apple(): '''a function that prints apple''' print('apple')print(apple.__name__) # appleprint(apple.__doc__) # 打印apple的函數
例子包括函數名 .__name__ 或函數 docstring .__doc__
裝飾器用于改變函數的行為方式,而無需修改任何源代碼。
def greet(name): return 'hello ' + nameprint(greet('tom')) # hello tom
在這里,我們有一個普通的 greet 功能
def add_exclamation(func): def wrapper(name): return func(name) + '!' return wrapper@add_exclamationdef greet(name): return 'hello ' + nameprint(greet('tom')) # hello tom!
我們通過在 greet() 上添加 @add_exclamation 來用 add_exclamation() 來裝飾 greet()。這里,add_exclamation 是裝飾器,greet 是被裝飾的函數。
請注意,greet() 的行為已經改變,而我們根本沒有編輯 greet() 的源代碼。這是裝飾器的功勞。
def add_exclamation(func): def wrapper(name): return func(name) + '!' return wrapper@add_exclamationdef greet(name): return 'hello ' + nameprint(greet('tom')) # hello tom!
這是完全相同的:
def add_exclamation(func): def wrapper(name): return func(name) + '!' return wrapperdef greet(name): return 'hello ' + namegreet = add_exclamation(greet)print(greet('tom')) # hello tom!
注意 “greet = add_exclamation(greet) ”一行。
# 沒有裝飾def greet(name): '''says hello to someone''' return 'hello ' + nameprint(greet.__name__) # greetprint(greet.__doc__) # says hello to someone
在這里,我們可以順利打印 greet() 的元數據。
# 加了裝飾def add_exclamation(func): def wrapper(name): return func(name) + '!' return wrapper@add_exclamationdef greet(name): '''says hello to someone''' return 'hello ' + nameprint(greet.__name__) # wrapperprint(greet.__doc__) # None
用 add_exclamation 裝飾 greet 后,請注意元數據發生了變化。__name__ 變成了 “wrapper”,而 __doc__ 變成了 wrapper 的 docstring。
這是因為當我們裝飾 greet 時,我們實際上是在做這件事:
greet = add_exclamation(greet)
我們正在將 greet 重新分配給一個由 add_exclamation 返回的函數--wrapper。
這就是為什么當我們嘗試打印 greet.__name__ 和 greet.__doc__ 時,會打印 wrapper 的元數據的原因。
from functools import wrapsdef add_exclamation(func): @wraps(func) def wrapper(name): return func(name) + '!' return wrapper@add_exclamationdef greet(name): '''says hello to someone''' return 'hello ' + nameprint(greet.__name__) # greetprint(greet.__doc__) # says hello to someone
請注意,盡管使用了 ad_exclamation 裝飾,greet 的元數據還是回到了正常狀態。
更具體地說,@wraps(something) 用 something 的元數據覆蓋了函數的元數據。這樣,我們原來函數的元數據就不會丟失了。
本文鏈接:http://www.www897cc.com/showinfo-26-100714-0.htmlPython 中的 @wraps 到底是個啥東西?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 聊聊2024年Rust加密生態系統