揭開functools.wraps 的神秘面紗:維護函數元資料
裝飾器在擴充Python 函數的功能上發揮著至關重要的作用。然而,它們通常以丟失重要的函數元資料為代價,例如名稱、文件字串和參數列表。幸運的是,functools.wraps 作為救世主出現,保留了這些寶貴的資訊。
應用裝飾器時,原始函數被包裝函數替換,導致某些關鍵細節被掩蓋。例如,考慮以下範例:
def logged(func): def with_logging(*args, **kwargs): print(func.__name__ + " was called") return func(*args, **kwargs) return with_logging @logged def f(x): """does some math""" return x + x * x
如果執行 print(f.__name__),它將產生“with_logging”,並且 f.__doc__ 將傳回一個空字串。出現這種結果是因為包裝函數 with_logging 已經取代了 f.
functools.wraps 透過包裝裝飾器函數並確保裝飾函數的元資料保持完整來解決此問題。透過將@wraps(func) 應用於內部函數,如下所示,我們恢復了所需的行為:
from functools import wraps def logged(func): @wraps(func) def with_logging(*args, **kwargs): print(func.__name__ + " was called") return func(*args, **kwargs) return with_logging @logged def f(x): """does some math""" return x + x * x print(f.__name__) # prints 'f' print(f.__doc__) # prints 'does some math'
在這個修改後的示例中,f.__name__ 顯示“f”,而f.__doc__ 正確反映原始函數的文件字串。元資料保存對於維護函數的身份、文件和自省功能至關重要。
因此,請記住 functools.wraps 是裝飾器工具包中的重要工具,可防止資訊遺失並確保您的裝飾函數保留其功能預期屬性。
以上是`functools.wraps` 如何在 Python 裝飾器中保留函數元資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!