日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Python 中的 @wraps 到底是個啥東西?

來源: 責編: 時間:2024-07-12 17:21:21 119觀看
導讀只要你讀得很快你可能在隨意的 Python 代碼中見過這個 @wraps 的東西,你可能想知道這到底是什么?函數有元數據元數據指的是函數本身的數據。def apple(): '''a function that prints apple''' print('apple')print(ap

只要你讀得很快

你可能在隨意的 Python 代碼中見過這個 @wraps 的東西,你可能想知道這到底是什么?kXG28資訊網——每日最新資訊28at.com

函數有元數據

元數據指的是函數本身的數據。kXG28資訊網——每日最新資訊28at.com

def apple():  '''a function that prints apple'''  print('apple')print(apple.__name__)  # appleprint(apple.__doc__)   # 打印apple的函數

例子包括函數名 .__name__ 或函數 docstring .__doc__kXG28資訊網——每日最新資訊28at.com

裝飾器如何工作

裝飾器用于改變函數的行為方式,而無需修改任何源代碼。kXG28資訊網——每日最新資訊28at.com

def greet(name):    return 'hello ' + nameprint(greet('tom'))  # hello tom

在這里,我們有一個普通的 greet 功能kXG28資訊網——每日最新資訊28at.com

def add_exclamation(func):    def wrapper(name):        return func(name) + '!'    return wrapper@add_exclamationdef greet(name):    return 'hello ' + nameprint(greet('tom'))  # hello tom!

我們通過在 greet() 上添加 @add_exclamation 來用 add_exclamation() 來裝飾 greet()。這里,add_exclamation 是裝飾器,greet 是被裝飾的函數。kXG28資訊網——每日最新資訊28at.com

請注意,greet() 的行為已經改變,而我們根本沒有編輯 greet() 的源代碼。這是裝飾器的功勞。kXG28資訊網——每日最新資訊28at.com

裝飾語法魔術

def add_exclamation(func):    def wrapper(name):        return func(name) + '!'    return wrapper@add_exclamationdef greet(name):    return 'hello ' + nameprint(greet('tom'))  # hello tom!

這是完全相同的:kXG28資訊網——每日最新資訊28at.com

def add_exclamation(func):    def wrapper(name):        return func(name) + '!'    return wrapperdef greet(name):    return 'hello ' + namegreet = add_exclamation(greet)print(greet('tom'))  # hello tom!

注意 “greet = add_exclamation(greet) ”一行。kXG28資訊網——每日最新資訊28at.com

裝飾會導致元數據丟失

# 沒有裝飾def greet(name):  '''says hello to someone'''  return 'hello ' + nameprint(greet.__name__)  # greetprint(greet.__doc__)   # says hello to someone

在這里,我們可以順利打印 greet() 的元數據。kXG28資訊網——每日最新資訊28at.com

# 加了裝飾def add_exclamation(func):    def wrapper(name):        return func(name) + '!'    return wrapper@add_exclamationdef greet(name):  '''says hello to someone'''  return 'hello ' + nameprint(greet.__name__)  # wrapperprint(greet.__doc__)   # None

用 add_exclamation 裝飾 greet 后,請注意元數據發生了變化。__name__ 變成了 “wrapper”,而 __doc__ 變成了 wrapper 的 docstring。kXG28資訊網——每日最新資訊28at.com

這是因為當我們裝飾 greet 時,我們實際上是在做這件事:kXG28資訊網——每日最新資訊28at.com

greet = add_exclamation(greet)

我們正在將 greet 重新分配給一個由 add_exclamation 返回的函數--wrapper。kXG28資訊網——每日最新資訊28at.com

這就是為什么當我們嘗試打印 greet.__name__ 和 greet.__doc__ 時,會打印 wrapper 的元數據的原因。kXG28資訊網——每日最新資訊28at.com

@wraps 防止元數據在裝飾過程中丟失

from functools import wrapsdef add_exclamation(func):    @wraps(func)    def wrapper(name):        return func(name) + '!'    return wrapper@add_exclamationdef greet(name):  '''says hello to someone'''  return 'hello ' + nameprint(greet.__name__)  # greetprint(greet.__doc__)   # says hello to someone

請注意,盡管使用了 ad_exclamation 裝飾,greet 的元數據還是回到了正常狀態。kXG28資訊網——每日最新資訊28at.com

更具體地說,@wraps(something) 用 something 的元數據覆蓋了函數的元數據。這樣,我們原來函數的元數據就不會丟失了。kXG28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-100714-0.htmlPython 中的 @wraps 到底是個啥東西?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 聊聊2024年Rust加密生態系統

下一篇: 使用 Docker 搭建 NodeJS 開發環境是一種什么體驗?

標簽:
  • 熱門焦點
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 一加Ace2 Pro真機揭曉 鈦空灰配色質感拉滿

    終于,在經過了幾波預熱之后,一加Ace2 Pro的外觀真機圖在網上出現了。還是博主數碼閑聊站曝光的,這次的外觀設計還是延續了一加11的方案,只是細節上有了調整,例如新加入了鈦空灰
  • Redmi Buds 4開箱簡評:才199還有降噪 可以無腦入

    在上個月舉辦的Redmi Note11T Pro系列新機發布會上,除了兩款手機新品之外,Redmi還帶來了兩款TWS真無線藍牙耳機產品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們在Redmi Note11T
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法。可以用來發現應用程序、操作系統和網絡協議等中的漏洞或
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • 花7萬退貨退款無門:誰在縱容淘寶珠寶商家造假?

    來源:極點商業作者:楊銘在淘寶購買珠寶玉石后,因為保證金不夠賠付,店鋪關閉,退貨退款難、維權無門的比比皆是。“提供相關產品鑒定證書,支持全國復檢,可以30天無理由退換貨。&
  • iQOO Neo8 Pro即將開售:到手價3099元起 安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 芦山县| 琼海市| 楚雄市| 凌源市| 青铜峡市| 特克斯县| 阳信县| 连云港市| 西吉县| 武宁县| 乡城县| 南靖县| 钦州市| 库尔勒市| 论坛| 开封市| 扶沟县| 宜昌市| 新田县| 临江市| 如东县| 兴安盟| 虹口区| 武乡县| 黄陵县| 平武县| 沙坪坝区| 崇义县| 五寨县| 大石桥市| 中卫市| 西平县| 吉林省| 安多县| 枝江市| 吴堡县| 昭觉县| 镇平县| 朝阳县| 金坛市| 三门峡市|