使用通用裝飾器裝飾函數時會出現問題,該裝飾器會更改函數的參數,例如類型轉換、日誌記錄或記憶化。修飾函數無法繼承原始函數的文件和簽名,這使得理解其行為變得困難。
為了解決這個問題,已經提出了多種解決方法:
使用pip 安裝「裝飾器」模組並修改裝飾器定義以包含decorator.decorator註解。這確保了裝飾器在保留函數簽名的同時保持通用性:
<code class="python">import decorator @decorator.decorator def args_as_ints(f, *args, **kwargs): # Perform argument conversion return f(*args, **kwargs)</code>
對於Python 3.4 及更高版本,' functools.wraps( )' 提供了一個自動保留函式簽章和文件的替代解決方案:
<code class="python">import functools def args_as_ints(func): @functools.wraps(func) def wrapper(*args, **kwargs): # Perform argument conversion return func(*args, **kwargs) return wrapper</code>
兩種方法都有效地保留了原始函數的簽章和文件. 「decorator」模組適用於 Python 2 和 3,而「functools.wraps()」僅適用於 Python 3.4 及更高版本。
以上是如何保留裝飾函數的簽名的詳細內容。更多資訊請關注PHP中文網其他相關文章!