欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python中的上下文管理器

系統(tǒng) 1630 0

Python中的上下文管理器,實(shí)際上就是實(shí)現(xiàn)了上下文管理協(xié)議的對(duì)象。在Python中打開(kāi)文件的時(shí)候,我們需要確保文件被使用完畢之后,對(duì)其進(jìn)行關(guān)閉操作——調(diào)用文件對(duì)象的close()方法。如果不使用上下文管理器,經(jīng)典的處理方式就是將close()方法的調(diào)用放在一個(gè)finally語(yǔ)句中:

            
              f = open("www.log")

try:
    print("do something with file")
finally:
    f.close()
            
          

?這里finally的唯一作用就是確保文件對(duì)象最后被正確關(guān)閉,為此我們使用了一個(gè)try...finally語(yǔ)句塊——這就需要我們?cè)趯?shí)現(xiàn)業(yè)務(wù)邏輯的時(shí)候,去考慮一些業(yè)務(wù)邏輯之外的東西,我們需要一個(gè)類(lèi)似于自動(dòng)內(nèi)存回收(GC)的機(jī)制,來(lái)自動(dòng)地幫我們做文件描述符的清理,讓我們把精力都用在業(yè)務(wù)邏輯實(shí)現(xiàn)上。上下文管理器就可以達(dá)到這樣的目的。而Python的文件對(duì)象是實(shí)現(xiàn)了這個(gè)協(xié)議了的:

            
              with open("www.log") as f:
    print("do something with file")
            
          

這和上面的try...finally風(fēng)格的代碼實(shí)現(xiàn)了等價(jià)的功能,只不過(guò)這里的代碼更加簡(jiǎn)潔了,文件對(duì)象最后也可以被關(guān)閉。

上下文管理協(xié)議的定義非常簡(jiǎn)單,就是在被上下文包覆的代碼執(zhí)行前執(zhí)行一個(gè)__enter__方法;在被包覆代碼之后執(zhí)行一個(gè)__exit__方法,根據(jù)這個(gè)定義我們就能寫(xiě)出一個(gè)非常簡(jiǎn)單的上下文管理器:

            
              class SimpleContext:
    def __enter__(self):
        print("before code block")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("after code block")


if __name__ == '__main__':
    with SimpleContext():
        print("I am code block")
            
          

運(yùn)行這個(gè)代碼的輸出為:

            
              before code block
I am code block
after code block

            
          

可以看到,with塊下的代碼執(zhí)行之前,運(yùn)行了上下文協(xié)議的__enter__方法,with塊下的代碼執(zhí)行之后,運(yùn)行了上下文協(xié)議的__exit__ 方法。

可以通過(guò)在__enter__方法中返回一個(gè)值,將此值定義應(yīng)用在with塊中,可以通過(guò)as關(guān)鍵詞來(lái)獲取對(duì)這個(gè)值的引用,這就是上面看到的with open("www.log") as f中獲取對(duì)f引用的方法:

            
              class SimpleContext:
    def __enter__(self):
        print("before code block")
        return 100

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("after code block")


if __name__ == '__main__':
    with SimpleContext() as sc:
        print(sc)
        print("I am code block")
            
          

這樣輸出就變成了:

            
              before code block
100
I am code block
after code block
            
          

另外可以通過(guò)__exit__方法的回調(diào)參數(shù)exc_type, exc_val, exc_tb來(lái)訪(fǎng)問(wèn)with語(yǔ)句塊的代碼執(zhí)行的異常信息,如果代碼塊一切正常,它們都是None;如果有異常拋出,就可以通過(guò)這三個(gè)參數(shù)來(lái)獲取異常信息,做相應(yīng)的處理。

以上就是上下文管理器的一個(gè)完整的內(nèi)容了。但是Python中,為了讓實(shí)現(xiàn)上下文管理器的過(guò)程更加簡(jiǎn)單,提供了另一種實(shí)現(xiàn)上下文協(xié)議的方法,就是通過(guò)contextlib模塊中的contextmanager裝飾器,結(jié)合使用生成器來(lái)實(shí)現(xiàn):

            
              import contextlib

@contextlib.contextmanager
def SimpleContext():
    print("before code block")
    try:
        yield 100
    except Exception as e:
        print("handle e here, not in __exit__")
    finally:
        print("after code block")


if __name__ == '__main__':
    with SimpleContext() as sc:
        print(sc)
        print("I am code block")
            
          

這個(gè)實(shí)現(xiàn)的輸出和上面的輸出是一致的,只是寫(xiě)法的不同。第一種寫(xiě)法結(jié)構(gòu)上更加清晰,第二種寫(xiě)法邏輯上更加連續(xù),哪一種方法更好,作出自己的選擇即可。

以上。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 九色视频网站 | 午夜国产亚洲精品一区 | 特级毛片s级全部免费 | 欧美一级做 | 色一级 | www久久精品 | 成人精品视频 成人影院 | 日日a.v拍夜夜添久久免费 | 精品日韩欧美国产一区二区 | 99热久久这里只有精品6国产网 | 杏导航aⅴ福利网站 | 亚洲精品久久久久久国产精华液 | 亚洲网站在线观看 | 91免费国产精品 | 一级黄色片子 | 一级黄片毛片 | 日韩亚洲一区二区 | 在线国产视频 | 国产精品极品美女自在线看免费一区二区 | 亚洲欧美日韩中文字幕久久 | 日本阿v无码观看dvd | 欧美一级www片免费观看 | 亚洲97视频 | 2022最新a精品视频在线观看 | 国产成人免费视频网站高清观看视频 | 亚洲高清国产品国语在线观看 | 狠狠干美女 | 国产四虎精品8848hh | 国产精品中文字幕在线 | 亚洲蜜桃AV色情精品成人 | 日韩精品视频免费观看 | 国产成人一区二区 | 中文字幕一区在线观看视频 | 夜夜爽99久久国产综合精品女不卡 | 亚洲一区二区三区四区五区中文 | 国产亚洲精品久久久久久一区二区 | 欧美高清在线视频一区二区 | 日韩一页| 亚洲日韩中文字幕一区 | 久久国产免费看 | 碰碰碰精品视频在线观看 |