python基礎(chǔ)(functools)

推薦:[http://www.wklken.me/posts/2013/08/18/python-extra-functools.html]
由于經(jīng)常在tensorflow的代碼中看到functools這個(gè)函數(shù)埃疫,有不太明白就寫了這個(gè)博文。
*************************************************傳說(shuō)中的分割線*********************************************
functools的常見(jiàn)函數(shù):其中最常見(jiàn)的自然是functools.partial

  • functools.partial
  • functool.update_wrapper
  • functool.wraps
  • functools.reduce
  • functools.cmp_to_key
  • functools.total_ordering

functools.partial

functools.partial的作用和tensorflow的slim很像榄檬,主要作用就是簡(jiǎn)化函數(shù)诞仓,更少更靈活的函數(shù)參數(shù)調(diào)用涮雷。
functools.partial可以讓我們通過(guò)包裝的方法,減少你的函數(shù)參數(shù)僻族。
源代碼:

#args/keywords 調(diào)用partial時(shí)參數(shù)
def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords) #合并婚惫,調(diào)用原始函數(shù),此時(shí)用了partial的參數(shù)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

partial將你傳入的參數(shù)保存氨鹏,如果你需要使用的時(shí)候則添加進(jìn)入欧募。

示例:

def add(a, b):
    return a + b
print add(4, 2)
plus3 = partial(add, 4)
plus5 = partial(add, 5)
print plus3(2)
print plus3(7)
print plus5(10)
# 6
# 6
# 11
# 15
type(plus3)
#<class 'functools.partial'>

可以看出返回的其實(shí)是一個(gè)partial類型的變量压状,實(shí)際相當(dāng)于在partial中保存了需要調(diào)用的函數(shù)以及參數(shù)仆抵,在需要調(diào)用的時(shí)候?qū)㈩A(yù)先設(shè)置的參數(shù)傳入?yún)?shù)列表。

functool.update_wrapper

默認(rèn)partial對(duì)象沒(méi)有namedoc, 這種情況下种冬,對(duì)于裝飾器函數(shù)非常難以debug.使用update_wrapper(),從原始對(duì)象拷貝或加入現(xiàn)有partial對(duì)象

它可以把被封裝函數(shù)的name镣丑、module、docdict都復(fù)制到封裝函數(shù)去(模塊級(jí)別常量WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
說(shuō)白了就是沒(méi)有加@functools.wraps的函數(shù)娱两,裝飾器@返回的是函數(shù)名是原本的但是其函數(shù)簽名等內(nèi)部參數(shù)說(shuō)明卻是裝飾原函數(shù)的那個(gè)函數(shù)的莺匠。
使用了@functools.wraps的函數(shù),它能夠幫助你在裝飾器@保存被裝飾的函數(shù)的函數(shù)內(nèi)部簽名等信息十兢。

#!/usr/bin/env python
# encoding: utf-8

def wrap(func):
    def call_it(*args, **kwargs):
        """wrap func: call_it"""
        print('before call')
        return func(*args, **kwargs)
    return call_it

@wrap
def hello():
    """say hello"""
    print('hello world')

from functools import update_wrapper
def wrap2(func):
    def call_it(*args, **kwargs):
        """wrap func: call_it2"""
        print('before call')
        return func(*args, **kwargs)
    return update_wrapper(call_it, func)

@wrap2
def hello2():
    """test hello"""
    print('hello world2')

if __name__ == '__main__':
    # hello()
    print(hello.__name__)
    print(hello.__doc__)
    # hello2()
    print(hello2.__name__)
    print(hello2.__doc__)
#call_it
#wrap func: call_it
#hello2
#test hello

functool.wraps

實(shí)驗(yàn)發(fā)現(xiàn)其實(shí)這個(gè)是對(duì)于update_wrapper的再次簡(jiǎn)化趣竣,與之前的函數(shù)有區(qū)別的地方在于:

def wrap2(func):
    @functools.wraps(func)
    def call_it(*args, **kwargs):
        """wrap func: call_it2"""
        print('before call')
        return func(*args, **kwargs)
    return call_it

相當(dāng)于@functools.wraps(func)這句話代替了update_wrapper(call_it, func),其他的輸出結(jié)果相同旱物。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遥缕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宵呛,更是在濱河造成了極大的恐慌单匣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宝穗,死亡現(xiàn)場(chǎng)離奇詭異户秤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)逮矛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門鸡号,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人须鼎,你說(shuō)我怎么就攤上這事鲸伴】懊辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵挑围,是天一觀的道長(zhǎng)礁竞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)杉辙,這世上最難降的妖魔是什么模捂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蜘矢,結(jié)果婚禮上狂男,老公的妹妹穿的比我還像新娘。我一直安慰自己品腹,他們只是感情好岖食,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著舞吭,像睡著了一般泡垃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羡鸥,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天蔑穴,我揣著相機(jī)與錄音,去河邊找鬼惧浴。 笑死存和,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衷旅。 我是一名探鬼主播捐腿,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柿顶!你這毒婦竟也來(lái)了茄袖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤九串,失蹤者是張志新(化名)和其女友劉穎绞佩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猪钮,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡品山,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烤低。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肘交。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扑馁,靈堂內(nèi)的尸體忽然破棺而出涯呻,到底是詐尸還是另有隱情凉驻,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布复罐,位于F島的核電站涝登,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏效诅。R本人自食惡果不足惜胀滚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乱投。 院中可真熱鬧咽笼,春花似錦、人聲如沸戚炫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)双肤。三九已至施掏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杨伙,已是汗流浹背其监。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工萌腿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留限匣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓毁菱,卻偏偏與公主長(zhǎng)得像米死,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贮庞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 包(lib)峦筒、模塊(module) 在Python中,存在包和模塊兩個(gè)常見(jiàn)概念窗慎。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,801評(píng)論 0 27
  • 1 functools函數(shù) functools模塊用于高階函數(shù):作用與或者返回其它函數(shù)的函數(shù)物喷。一般來(lái)說(shuō),對(duì)于該模塊...
    lakerszhy閱讀 9,978評(píng)論 0 7
  • 第1章 函數(shù)式編程 1-1 Python之函數(shù)式編程簡(jiǎn)介 函數(shù)式:functional遮斥,是一種編程范式峦失; 函數(shù)式編...
    惑也閱讀 623評(píng)論 0 5
  • Python進(jìn)階框架 希望大家喜歡,點(diǎn)贊哦首先感謝廖雪峰老師對(duì)于該課程的講解 一术吗、函數(shù)式編程 1.1 函數(shù)式編程簡(jiǎn)...
    Gaolex閱讀 5,493評(píng)論 6 53
  • ->工廠方法模式 ->抽象工廠
    孝直閱讀 203評(píng)論 0 1