Python 上下文管理器

上下文管理器是在Python 2.5加入的功能,什么是上下文管理器,Python’swithstatement supports the concept of a runtime contextdefined by a context manager.This is implemented using two separate methods

that allow user-defined classes to define a runtime context that is entered

before the statement body is executed and exited when the statement ends.這是文檔中對它的解釋。

所以,他的任務(wù)就是,在代碼塊執(zhí)行前,做準(zhǔn)備工作,在代碼塊執(zhí)行完成后,做結(jié)束處理工作,也就是白話中的收尾。

他的優(yōu)點(diǎn)不僅使代碼的可讀性更強(qiáng)并且減少了錯誤的幾率。

我們自己也可以實(shí)現(xiàn)一個上下文管理器:

當(dāng)然要實(shí)現(xiàn)一個上下文管理器,必須實(shí)現(xiàn)兩個方法,一個__enter__方法,一個__exit__方法。

前者在進(jìn)入代碼塊之前調(diào)用,后者在代碼塊執(zhí)行完成后調(diào)用。

class ContextManagerDemo:

? ? ? ? ?def __enter__(self):

? ? ? ? ? ? ? ?print 'Entering the block'

? ? ? ? ?def __exit__(self,type,value,traceback):

? ? ? ? ? ? ? ? print 'Exiting the block'

with ?ContextManagerDemo():

? ? ? ? ?print 'In the block'

#Output:

? ? ? ? ? ? ? Entering the block

? ? ? ? ? ? ? In the block

? ? ? ? ? ? ?Exiting the block

這是一個非常簡單的例子,那么異常處理放在哪里呢。

如果語句塊發(fā)生了異常,__exit__方法就會被調(diào)用,而異常將會被重新raise。如果我們不想讓異常被重新raise.也是有辦法的,我們讓__exit__方法返回True就可以阻止(不推薦)。

完備的__exit__方法名為:def __exit__(self,exc_type,exc_val,exc_tb) ? # (異常類型,異常值,異常追蹤信息)

我們還可以使用裝飾器和生成器來實(shí)現(xiàn)上下文管理器。python 有個contextlib模塊可以提供更易用的上下文管理器。

1.contextmanager

from contextlib import contextmanager

@contextmanager

def tag(name):

? ? ? ?print "<%s>" % name

? ? ? ?yield

? ? ? ?print "</%s>" % name

>>> with tag("h1"):

... ? ? ? ? ? ?print "foo"

...

output:

? ? ? ? ? ? <h1>

? ? ? ? ? ? foo

? ? ? ? ? ? </h1>

2.nested

with ?contextlib.nested(open('fileToRead.txt', 'r'),open('fileToWrite.txt', 'w')) as (reader, writer):

? ? ? ? writer.write(reader.read())

conetextlib.nested(..)方法有效地減少了嵌套

3.closing

from contextlib import closing

import urllib

with closing(urllib.urlopen('http://www.python.org')) as page:

? ? ? ? ?for line in page:

? ? ? ? ? ? ? ? print line

不需要明確的關(guān)閉Page.即使發(fā)生錯誤,當(dāng)with 代碼塊退出時Page.close() 將被調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 上下文管理器最常用的是確保正確關(guān)閉文件, with 語句的基本語法, expression是一個上下文管理器,其實(shí)...
    茍雨閱讀 859評論 0 1
  • contextlib — Context Manager Utilities contextlib - 上下文管理...
    英武閱讀 3,011評論 0 52
  • 打開手機(jī),天氣上顯示下周四會有雪,不知道會不會下來,如果會,這也將是2017年的第一場雪了,這使我不禁想起了,20...
    桃子taozi_taoai閱讀 343評論 0 1
  • 這段時間沒課了,生活就失去了節(jié)奏感,恍恍惚惚八天就過去了,今天終于找回感覺。 記得我之前給我將來規(guī)劃了一個模糊的職...
    李想主義閱讀 208評論 0 0
  • 你低聲呢喃著要 開心一些 渴求一雙手來 解開心中郁結(jié) 禱告聲停止 幻想難免破裂 誰會心甘情愿聆聽 一場美麗謊言 后...
    阿渲閱讀 332評論 0 0

友情鏈接更多精彩內(nèi)容