91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python創建裝飾器時保留函數元信息的方法

發布時間:2020-08-10 10:04:36 來源:億速云 閱讀:144 作者:小新 欄目:開發技術

Python創建裝飾器時保留函數元信息的方法?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!

問題

你寫了一個裝飾器作用在某個函數上,但是這個函數的重要的元信息比如名字、文檔字符串、注解和參數簽名都丟失了。

解決方案

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

import time
from functools import wraps
def timethis(func):
  '''
  Decorator that reports the execution time.
  '''
  @wraps(func)
  def wrapper(*args, **kwargs):
    start = time.time()
    result = func(*args, **kwargs)
    end = time.time()
    print(func.__name__, end-start)
    return result
  return wrapper

下面我們使用這個被包裝后的函數并檢查它的元信息:

>>> @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__
{'n': <class 'int'>}
>>>

討論

在編寫裝飾器的時候復制元信息是一個非常重要的部分。如果你忘記了使用 @wraps , 那么你會發現被裝飾函數丟失了所有有用的信息。比如如果忽略 @wraps 后的效果是下面這樣的:

>>> countdown.__name__
'wrapper'
>>> countdown.__doc__
>>> countdown.__annotations__
{}
>>>

@wraps 有一個重要特征是它能讓你通過屬性 __wrapped__ 直接訪問被包裝函數。例如:

>>> countdown.__wrapped__(100000)
>>>

__wrapped__ 屬性還能讓被裝飾函數正確暴露底層的參數簽名信息。例如:

>>> from inspect import signature
>>> print(signature(countdown))
(n:int)
>>>

一個很普遍的問題是怎樣讓裝飾器去直接復制原始函數的參數簽名信息, 如果想自己手動實現的話需要做大量的工作,最好就簡單的使用 @wraps 裝飾器。 通過底層的 __wrapped__ 屬性訪問到函數簽名信息。

感謝各位的閱讀!看完上述內容,你們對Python創建裝飾器時保留函數元信息的方法大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

虎林市| 疏附县| 昌乐县| 贞丰县| 垣曲县| 阿克陶县| 旬邑县| 吉安县| 荔波县| 新民市| 潍坊市| 宁明县| 六盘水市| 郑州市| 襄汾县| 清流县| 鹿邑县| 罗江县| 巫溪县| 泌阳县| 乐昌市| 浠水县| 宁都县| 枞阳县| 灵石县| 印江| 富顺县| 阳信县| 峨山| 固始县| 同仁县| 荆州市| 冕宁县| 东乌珠穆沁旗| 新沂市| 怀柔区| 全州县| 民权县| 汕头市| 衡水市| 莎车县|