最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python如何創(chuàng)建裝飾器時(shí)保留函數(shù)元信息

 更新時(shí)間:2020年08月07日 16:00:04   作者:D  
這篇文章主要介紹了Python如何創(chuàng)建裝飾器時(shí)保留函數(shù)元信息,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

問(wèn)題

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

解決方案

任何時(shí)候你定義裝飾器的時(shí)候,都應(yīng)該使用 functools 庫(kù)中的 @wraps 裝飾器來(lái)注解底層包裝函數(shù)。例如:

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

下面我們使用這個(gè)被包裝后的函數(shù)并檢查它的元信息:

>>> @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'>}
>>>

討論

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

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

@wraps 有一個(gè)重要特征是它能讓你通過(guò)屬性 __wrapped__ 直接訪問(wèn)被包裝函數(shù)。例如:

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

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

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

一個(gè)很普遍的問(wèn)題是怎樣讓裝飾器去直接復(fù)制原始函數(shù)的參數(shù)簽名信息, 如果想自己手動(dòng)實(shí)現(xiàn)的話需要做大量的工作,最好就簡(jiǎn)單的使用 @wraps 裝飾器。 通過(guò)底層的 __wrapped__ 屬性訪問(wèn)到函數(shù)簽名信息。

以上就是Python如何創(chuàng)建裝飾器時(shí)保留函數(shù)元信息的詳細(xì)內(nèi)容,更多關(guān)于Python保留函數(shù)元信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • pandas使用之寬表變窄表的實(shí)現(xiàn)

    pandas使用之寬表變窄表的實(shí)現(xiàn)

    這篇文章主要介紹了pandas使用之寬表變窄表的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • pyv8學(xué)習(xí)python和javascript變量進(jìn)行交互

    pyv8學(xué)習(xí)python和javascript變量進(jìn)行交互

    這篇文章主要介紹了pyv8學(xué)習(xí)python和javascript變量進(jìn)行交互,python取得javascript里面的值、javascript取得python里面的值、python和javascript里面的函數(shù)交互
    2013-12-12
  • Python異常處理之try...except語(yǔ)句

    Python異常處理之try...except語(yǔ)句

    Python異常處理是Python中重要的一部分,為了保證程序的穩(wěn)定性和可靠性,我們需要使用異常處理來(lái)及時(shí)捕獲,并以優(yōu)雅的方式來(lái)處理這些異常,本教程將介紹如何處理?Python中的異常,需要的朋友可以參考下
    2023-06-06
  • 解決Pycharm 導(dǎo)入其他文件夾源碼的2種方法

    解決Pycharm 導(dǎo)入其他文件夾源碼的2種方法

    今天小編就為大家分享一篇解決Pycharm 導(dǎo)入其他文件夾源碼的2種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • 用Python編寫一個(gè)簡(jiǎn)單的CS架構(gòu)后門的方法

    用Python編寫一個(gè)簡(jiǎn)單的CS架構(gòu)后門的方法

    今天小編就為大家分享一篇關(guān)于用Python編寫一個(gè)簡(jiǎn)單的CS架構(gòu)后門的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-11-11
  • tensorflow 查看梯度方式

    tensorflow 查看梯度方式

    今天小編就為大家分享一篇tensorflow 查看梯度方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python網(wǎng)絡(luò)編程基于多線程實(shí)現(xiàn)多用戶全雙工聊天功能示例

    Python網(wǎng)絡(luò)編程基于多線程實(shí)現(xiàn)多用戶全雙工聊天功能示例

    這篇文章主要介紹了Python網(wǎng)絡(luò)編程基于多線程實(shí)現(xiàn)多用戶全雙工聊天功能,結(jié)合實(shí)例形式分析了Python網(wǎng)絡(luò)編程中使用多線程進(jìn)行多用戶異步通信的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-04-04
  • Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__)

    Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__)

    本文主要介紹了Python 中下劃線的幾種用法(_、_xx、xx_、__xx、__xx__),詳細(xì)的介紹了這幾種下劃線的用處,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • JetBrains PyCharm(Community版本)的下載、安裝和初步使用圖文教程詳解

    JetBrains PyCharm(Community版本)的下載、安裝和初步使用圖文教程詳解

    這篇文章主要介紹了JetBrains PyCharm(Community版本)的下載、安裝和初步使用教程,本文圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)和工作具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2020-03-03
  • Python 性能優(yōu)化技巧總結(jié)

    Python 性能優(yōu)化技巧總結(jié)

    代碼優(yōu)化能夠讓程序運(yùn)行更快,它是在不改變程序運(yùn)行結(jié)果的情況下使得程序的運(yùn)行效率更高,根據(jù) 80/20 原則,實(shí)現(xiàn)程序的重構(gòu)、優(yōu)化、擴(kuò)展以及文檔相關(guān)的事情通常需要消耗 80% 的工作量。優(yōu)化通常包含兩方面的內(nèi)容:減小代碼的體積,提高代碼的運(yùn)行效率。
    2016-11-11

最新評(píng)論

双城市| 建湖县| 江孜县| 青岛市| 中江县| 双柏县| 太原市| 大洼县| 武义县| 安福县| 鹤壁市| 泰安市| 鄄城县| 县级市| 喀喇沁旗| 大余县| 滁州市| 奉新县| 临安市| 锡林浩特市| 庆城县| 巴中市| 浠水县| 孙吴县| 康乐县| 旬邑县| 双柏县| 兴宁市| 巴林左旗| 乌鲁木齐市| 河东区| 阜康市| 麻城市| 固安县| 恩施市| 成安县| 寿光市| 阿克陶县| 衡阳市| 鄯善县| 新干县|