国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

functools.wraps裝飾器

來源:懂視網 責編:小采 時間:2020-11-27 14:28:04
文檔

functools.wraps裝飾器

functools.wraps裝飾器:wraps其實沒有實際的大用處, 就是用來解決裝飾器導致的原函數名指向的函數 的屬性發生變化的問題;裝飾器裝飾過函數func, 此時func不是指向真正的func,而是指向裝飾器中的裝飾過的函數import sys debug_log = sys.stderr def trace(
推薦度:
導讀functools.wraps裝飾器:wraps其實沒有實際的大用處, 就是用來解決裝飾器導致的原函數名指向的函數 的屬性發生變化的問題;裝飾器裝飾過函數func, 此時func不是指向真正的func,而是指向裝飾器中的裝飾過的函數import sys debug_log = sys.stderr def trace(

wraps其實沒有實際的大用處, 就是用來解決裝飾器導致的原函數名指向的函數 的屬性發生變化的問題;

裝飾器裝飾過函數func, 此時func不是指向真正的func,而是指向裝飾器中的裝飾過的函數

import sys

debug_log = sys.stderr

def trace(func):
 if debug_log:
 def callf(*args, **kwargs):
 """A wrapper function."""
 debug_log.write('Calling function: {}
'.format(func.__name__))
 res = func(*args, **kwargs)
 debug_log.write('Return value: {}
'.format(res))
 return res
 return callf
 else:
 return func

@trace
def square(x):
 """Calculate the square of the given number."""
 return x * x

這里的 square 其實指向的是 calls, 可以用help(square)或者 square.__name__ 看下。

square 被裝飾后的函數其實已經是另外一個函數了(函數名等函數屬性會發生改變)

如果使用wraps進行修飾

def trace(func):
 if debug_log:
 @functools.wraps(func)
 def callf(*args, **kwargs):
 """A wrapper function."""
 debug_log.write('Calling function: {}
'.format(func.__name__))
 res = func(*args, **kwargs)
 debug_log.write('Return value: {}
'.format(res))
 return res
 return callf
 else:
 return func

此時 用trace 裝飾的 square 的屬性就不會變化了,可以help(square) 看看

原因:我們把wraps的裝飾的代碼翻譯如下,其等價為:

def trace(func):
 if debug_log:
 def _callf(*args, **kwargs):
 """A wrapper function."""
 debug_log.write('Calling function: {}
'.format(func.__name__))
 res = func(*args, **kwargs)
 debug_log.write('Return value: {}
'.format(res))
 return res

 callf = functools.update_wrapper(_callf, wrapped = func,assigned = functools.WRAPPER_ASSIGNMENTS,updated = functools.WRAPPER_UPDATES)

 return callf
 else:
 return func

update_wrapper做的工作很簡單,就是用參數wrapped表示的函數對象(例如:square)的一些屬性(如:__name__、 __doc__)覆蓋參數wrapper表示的函數對象(例如:callf,這里callf只是簡單地調用square函數,因此可以說callf是 square的一個wrapper function)的這些相應屬性。

因此,本例中使用wraps裝飾器“裝飾”過callf后,callf的__doc__、__name__等屬性和trace要“裝飾”的函數square的這些屬性完全一樣。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

functools.wraps裝飾器

functools.wraps裝飾器:wraps其實沒有實際的大用處, 就是用來解決裝飾器導致的原函數名指向的函數 的屬性發生變化的問題;裝飾器裝飾過函數func, 此時func不是指向真正的func,而是指向裝飾器中的裝飾過的函數import sys debug_log = sys.stderr def trace(
推薦度:
標簽: fun python 裝飾器
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 久久伊人一区二区三区四区 | 免费国产精品视频 | 久久久久国产精品美女毛片 | 亚洲色图欧美自拍 | 亚洲最新视频在线观看 | 色老头久久久久久久久久 | 国产亚洲欧美在线人成aaaa | 日韩精品在线第一页 | xx中文字幕乱偷avxx | 国产精品成久久久久三级 | 2021国产精品成人免费视频 | 国产日韩中文字幕 | 图片亚洲va欧美va国产综合 | 国产日韩视频在线 | 欧美亚洲天堂 | 午夜看一级特黄a大片黑 | 不卡国产视频 | 欧美综合国产精品日韩一 | 亚洲色图国产精品 | 亚洲色图欧美在线 | 久久一本日韩精品中文字幕屁孩 | 福利一区福利二区 | 日韩中文欧美 | 在线国产视频 | 亚洲一区二区三区在线播放 | 日韩欧美在线第一页 | 欧美在线视频一区二区三区 | 国产精品系列在线观看 | 国产亚洲美女精品久久久2020 | 精品国产日韩亚洲一区在线 | 亚洲另类色图 | 国产欧美精品综合一区 | 国产一区二三区 | 日韩视频一区二区在线观看 | 亚洲欧洲日韩国产 | 欧美日韩高清在线 | 精品日韩在线观看 | 久久精品人| 国内一级一级毛片a免费 | 久久久久88色偷偷免费 | 欧美亚洲综合另类 |