Python如何建立裝飾器時保留函式元資訊

2021-10-10 09:09:40 字數 1338 閱讀 3284

更多程式設計教程請到:菜鳥教程

問題

你寫了乙個裝飾器作用在某個函式上,但是這個函式的重要的元資訊比如名字、文件字串、註解和引數簽名都丟失了。

解決方案

任何時候你定義裝飾器的時候,都應該使用 functools 庫中的 @wraps 裝飾器來註解底層包裝函式。例如:

import time

from functools import wraps

def timethis(func):

'''decorator that reports the execution time.

'''@wraps(func)

start = time.time()

result = func(*args, **kwargs)

end = time.time()

print(func.__name__, end-start)

return result

下面我們使用這個被包裝後的函式並檢查它的元資訊:

>>> @timethis

... def countdown(n):

... '''

... counts down

... '''

... while n > 0:

... n -= 1

...>>> countdown(100000)

countdown 0.008917808532714844

>>> countdown.__name__

'countdown'

>>> countdown.__doc__

'\n\tcounts down\n\t'

>>> countdown.__annotations__

>>>

討論

在編寫裝飾器的時候複製元資訊是乙個非常重要的部分。如果你忘記了使用@wraps, 那麼你會發現被裝飾函式丟失了所有有用的資訊。比如如果忽略@wraps後的效果是下面這樣的:

>>> countdown.__name__

>>> countdown.__doc__

>>> countdown.__annotations__

{}>>>

>>>

>>> from inspect import signature

>>> print(signature(countdown))

(n:int)

>>>

python裝飾器 如何使用函式裝飾器

問題舉例 有時候我們想為多個函式統一新增某種功能,比如計時統計 記錄日誌,快取運算結果等 我們並不想在每個函式內一一新增完全相同的 有什麼解決方案嗎?定義裝飾器函式,用它在原函式的基礎上生成乙個新增新功能的函式來代替原函式 def memo func cache def wrap args res ...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...