亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

python上下文管理器及with語句

2019-11-14 17:41:59
字體:
來源:轉載
供稿:網友

with語句支持在一個叫上下文管理器的對象的控制下執行一系列語句,語法大概如下:

with context as var:    statements

其中的context必須是個上下文管理器,它實現了兩個方法__enter__,__exit__。

1.需求是怎么產生的

在正常的管理各種系統資源(文件、鎖定和連接),在涉及到異常時通常是個棘手的問題。異常很可能導致控制流跳過負責釋放關鍵資源的語句。

看一段簡單的文件寫入代碼:

filename = 'my_file.txt' f = open(filename,'w')  f.write('Hello ')  f.write('World')  f.close() 

如果發生了意外的情況,例如寫入'World'時磁盤空間不足,就會拋出異常,那么close()語句將不會被執行。

一般的解決方案是使用try-finally語句:

try:    filename = 'my_file.txt'     f = open(filename,'w')      f.write('Hello ')      f.write('World')finally:    f.close() 

但隨著語句的增多,try-finally顯然不夠簡潔,用with-as語句可以很簡潔的實現以上功能:

with open('my_file','w') as f:    f.write('Hello ')    f.write('World')

這樣不僅能處理出現異常的情況,而且還避免了在open一個文件后忘記了寫close()方法的情況。

線程中的鎖其實也實現了上下文管理協議:

import threadingwith threading.Lock():    # 關鍵部分      statements    # 關鍵部分結束

再也不怕忘記將鎖釋放了。

2.上下文管理器的實現

上下文管理器要實現__enter__和__exit__的特殊方法。

__enter__(self): 進入上下文管理器時調用此方法,其返回值將被放入with-as語句中as說明符指定的變量中。

__exit__(self,type,value,tb):離開上下文管理器調用此方法。如果有異常出現,type、value、tb分別為異常的類型、值和追蹤信息。如果沒有異常,

3個參數均設為None。此方法返回值為True或者False,分別指示被引發的異常得到了還是沒有得到處理。如果返回False,引發的異常會被傳遞出上下文。

文件上下文管理協議大概是如下實現的:

class OpenFile(object):    def __init__(self,filename,mode):        self.filename=filename        self.mode=mode    def __enter__(self):        self.f=open(self.filename,self.mode)        return self.f  #作為as說明符指定的變量的值    def __exit__(self,type,value,tb):        self.f.close()        return False   #異常會被傳遞出上下文with OpenFile('my_file.txt','w') as f:    f.write('Hello ')    f.write('World')

  相當于

try :    執行__enter__的內容finally:    執行__exit__的內容

3.異常的處理 

__exit__函數就能夠拿到關于異常的所有信息(異常類型,異常值以及異常追蹤信息),這些信息將幫助異常處理操作。

class ListTrans(object):    def __init__(self,alist):        self.alist=alist    def __enter__(self):        self.thecopy=list(self.alist)        return self.thecopy    def __exit__(self,exc_type,value,tb):        if exc_type is None:            self.alist[:]=self.thecopy        return False

沒有異常發生時:

alist=[]with ListTrans(alist) as working:    working.append(1)    working.append(2)PRint alist

生成:

[1, 2]

有異常發生時:

alist=[]with ListTrans(alist) as working:    working.append(1)    working.append(2)    raise RuntimeError('we are hosed')print alist

生成:

RuntimeError: we are hosed

alist無變化。

可以捕捉異常:

alist=[]try:    with ListTrans(alist) as working:        working.append(1)        working.append(2)        raise RuntimeError('we are hosed')except RuntimeError as e:    print eprint alist

生成:

we are hosed[]

當然,也可以簡單的將__exit__的返回值設為True來忽略異常。

4.contextmanager裝飾器

@contextmanager

contextlib模塊的contextmanager裝飾器可以更方便的實現上下文管理器。

任何能夠被yield關鍵詞分割成兩部分的函數,都能夠通過裝飾器裝飾的上下文管理器來實現。任何在yield之前的內容都可以看做在代碼塊執行前的操作,

而任何yield之后的操作都可以放在exit函數中。

from contextlib import contextmanager@contextmanagerdef listTrans(alist):    thecopy=list(alist)    yield thecopy    alist[:]=thecopyalist=[]with listTrans(alist) as working:    working.append(1)    working.append(2)print alist

yield返回的值相當于__enter__的返回值。

要注意的是,這不是異常安全的寫法,也就是說,當出現異常時,yield后的語句是不會執行的,想要異常安全,可用try捕捉異常:

from contextlib import contextmanager@contextmanagerdef listTrans(alist):    thecopy=list(alist)    try:        yield thecopy    except RuntimeError:        pass    alist[:]=thecopyalist=[]with listTrans(alist) as working:    working.append(1)    working.append(2)    raise RuntimeError

nested與closing

contextlib模塊還有兩個好玩的方法:nested,closing。

nested:用來更方便的減少嵌套寫法:

當要嵌套的寫上下文管理器時:

with open('toReadFile', 'r') as reader:      with open('toWriteFile', 'w') as writer:          writer.writer(reader.read())

可以用nested簡化寫法:

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

python2.7后nested就過時了:

with open('fileToRead.txt', 'r') as reader,open('fileToWrite.txt', 'w') as writer:          writer.write(reader.read()) 

closing(object):創建上下文管理器,在執行過程離開with語句時自動執行object.close():

class Door(object) :    def open(self) :        print 'Door is opened'    def close(self) :        print 'Door is closed'with contextlib.closing(Door()) as door :    door.open()

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品一区二区| 久久国产精品免费视频| 911国产网站尤物在线观看| 色www亚洲国产张柏芝| 亚洲精品日韩在线| 91在线高清视频| 亚洲综合社区网| 亚洲午夜未删减在线观看| 久久影视电视剧免费网站| 日韩美女视频免费在线观看| 国产精品一区二区久久久| 18久久久久久| 亚洲精品国产精品国自产观看浪潮| 欧美精品福利在线| 国产成人鲁鲁免费视频a| 亚洲欧美日韩精品| 国产精品免费电影| 中文字幕国产精品| 人体精品一二三区| 欧美大片免费观看在线观看网站推荐| 国产精品视频中文字幕91| 亚洲成人网在线| 日韩中文在线观看| 精品少妇v888av| 国产亚洲欧美一区| 日韩av在线高清| 91九色蝌蚪国产| 在线播放日韩专区| 亚洲理论电影网| 欧美成人免费视频| 亚洲高清一二三区| 国产精品极品美女在线观看免费| 美女av一区二区| 久久久久久久97| 亚洲白虎美女被爆操| 中日韩午夜理伦电影免费| 欧美肥婆姓交大片| 日韩欧美精品网址| 亚洲精品一区二区在线| 亚洲精品久久久久| 欧美另类69精品久久久久9999| 欧美成人sm免费视频| 91精品国产综合久久香蕉| 国产91精品久久久久久久| 久久久av电影| 日韩在线视频免费观看高清中文| 亚洲午夜激情免费视频| 国产福利精品视频| 亚洲999一在线观看www| 高清在线视频日韩欧美| 九九热视频这里只有精品| 国产精品成人在线| 亚洲国产一区二区三区在线观看| 亚洲色图综合网| 国产一区二区三区久久精品| 国产精品在线看| 成人中心免费视频| 亚洲国产精品va在线观看黑人| 这里只有精品视频| 日韩欧美黄色动漫| 亚洲国产精久久久久久久| 亚洲国产成人av在线| 日韩一区二区欧美| 成人黄色在线免费| 色偷偷噜噜噜亚洲男人的天堂| 91精品国产自产在线观看永久| 亚洲一区二区三区四区视频| 668精品在线视频| 国产精品第一页在线| 91国内免费在线视频| 国产综合福利在线| 色噜噜狠狠狠综合曰曰曰88av| 国产区亚洲区欧美区| 国产精品av网站| 亚洲国产精品99久久| 国产丝袜一区二区三区| 欧美在线影院在线视频| 欧美成人精品影院| 国产精品精品视频一区二区三区| 日韩免费av在线| 亚洲免费影视第一页| 国产在线观看91精品一区| 日韩久久免费视频| 亚洲精品不卡在线| 色综合久久中文字幕综合网小说| 日韩久久免费视频| 欧美福利在线观看| 欧美日韩国产精品| 欧美色道久久88综合亚洲精品| 国产999在线| 久久久精品999| 日韩在线视频网| 久久精品国产视频| 91久久嫩草影院一区二区| 欧美重口另类videos人妖| 亚洲国产精品va在线看黑人动漫| 成人www视频在线观看| 欧美成人免费一级人片100| 中文字幕欧美精品日韩中文字幕| 97精品在线视频| 欧美激情一级精品国产| 66m—66摸成人免费视频| 久久久99免费视频| 欧美性猛交99久久久久99按摩| 久久综合久久美利坚合众国| 日韩女优人人人人射在线视频| 国产精品久久久久aaaa九色| 亚洲国产精彩中文乱码av在线播放| 成人免费网站在线观看| 久久国产精品电影| 久久免费少妇高潮久久精品99| 国产欧美日韩精品专区| 亚洲国产成人91精品| 亚洲国产精品久久久久秋霞蜜臀| 秋霞成人午夜鲁丝一区二区三区| 日韩av在线播放资源| 成人写真福利网| 精品女同一区二区三区在线播放| 色婷婷综合久久久久| 国产中文字幕91| 国模视频一区二区| 日本在线精品视频| 欧美午夜www高清视频| 精品久久久久久久久久ntr影视| 亚洲精品午夜精品| 亚洲综合成人婷婷小说| 国产视频精品久久久| 亚洲一区二区三区四区在线播放| 午夜精品久久久久久久白皮肤| 91精品国产高清| 日韩免费观看在线观看| 97欧美精品一区二区三区| 韩国福利视频一区| 亚洲综合社区网| 欧美性理论片在线观看片免费| 亚洲最大福利网站| 69久久夜色精品国产69| 97色在线播放视频| 午夜免费久久久久| 久久久中文字幕| 欧美裸体xxxx极品少妇软件| 中文一区二区视频| 久久精品美女视频网站| 亚洲在线www| 精品色蜜蜜精品视频在线观看| 日韩精品极品视频| 91中文在线观看| 欧美激情国产日韩精品一区18| 26uuu亚洲国产精品| 欧美激情视频网址| 成人免费网站在线观看| 精品久久久久久久久久久| 亚洲xxxxx性| 日韩日本欧美亚洲| 欧美性生活大片免费观看网址| 在线电影av不卡网址| 久久国产精品偷| 久久久久久久久综合| 91久久综合亚洲鲁鲁五月天| 亚洲区免费影片| 日韩欧美视频一区二区三区| 色伦专区97中文字幕| 欧美成人小视频| 91精品国产91久久久久久|