日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

python with語句的原理與用法詳解

瀏覽:100日期:2022-07-31 17:18:19

本文實(shí)例講述了python with語句的原理與用法。分享給大家供大家參考,具體如下:

之前看到一篇博客說博主python面試時(shí)遇到面試官提問with的原理,而那位博主的博文沒有提及with原理,故有此文。

關(guān)于with語句,官方文檔中是這樣描述的:

The with statement is used to wrap the execution of a block with methods defined by a context manager (see section With Statement Context Managers). This allows common try...except...finally usage patterns to be encapsulated for convenient reuse.

with_stmt ::= 'with' with_item (',' with_item)* ':' suite

with_item ::= expression ['as' target]

The execution of the with statement with one “item” proceeds as follows:

The context expression (the expression given in the with_item) is evaluated to obtain a context manager.

The context manager’s __exit__() is loaded for later use.

The context manager’s __enter__() method is invoked.

If a target was included in the with statement, the return value from __enter__() is assigned to it.

Note

The with statement guarantees that if the __enter__() method returns without an error, then __exit__() will always be called. Thus, if an error occurs during the assignment to the target list, it will be treated the same as an error occurring within the suite would be. See step 6 below.

The suite is executed.

The context manager’s __exit__() method is invoked. If an exception caused the suite to be exited, its type, value, and traceback are passed as arguments to __exit__(). Otherwise, three None arguments are supplied.

谷歌翻譯成中文就是:

with語句用于使用由上下文管理器定義的方法來封裝塊的執(zhí)行(請參見使用語句上下文管理器一節(jié))。 這允許通用的try…except…finally使用模式被封裝以便于重用【這句話大概意思就是“with語句”類似于try…except…finally封裝之后的的情況】。

帶有一個(gè)“項(xiàng)目”的with語句的執(zhí)行過程如下:1.上下文表達(dá)式(在with_item中給出的表達(dá)式)被評估以獲得上下文管理器。【會區(qū)分類型來處理,如文件,進(jìn)程等都可以使用with語句】2.上下文管理器的__exit __()被加載供以后使用。【負(fù)責(zé)上下文的退出】3.上下文管理器的__enter __()方法被調(diào)用。【負(fù)責(zé)上下文的進(jìn)入】4.如果在with語句中包含目標(biāo),則將__enter __()的返回值分配給它。【如果with后面跟著as 對象(如with open() as f),那么此對象獲得with上下文對象的__enter__()的返回值,(附:應(yīng)該是類似操作數(shù)據(jù)庫時(shí)的連接對象和游標(biāo)的區(qū)別)】

注意with語句保證,如果__enter __()方法返回時(shí)沒有錯(cuò)誤,那么將始終調(diào)用__exit __()。 因此,如果在分配給目標(biāo)列表期間發(fā)生錯(cuò)誤,它將被視為與套件內(nèi)發(fā)生的錯(cuò)誤相同。 請參閱下面的第6步。

5.該套件已執(zhí)行。【意思就是語句體中的過程執(zhí)行完畢,執(zhí)行完畢就到第六步--調(diào)用__exit__()來退出】6.上下文管理器的__exit __()方法被調(diào)用。 如果異常導(dǎo)致套件退出,則其類型,值和回溯作為參數(shù)傳遞給__exit __()。 否則,將提供三個(gè)無參數(shù)。

關(guān)于退出返回值:

If the suite was exited due to an exception, and the return value from the __exit__() method was false, the exception is reraised. If the return value was true, the exception is suppressed, and execution continues with the statement following the with statement.

If the suite was exited for any reason other than an exception, the return value from __exit__() is ignored, and execution proceeds at the normal location for the kind of exit that was taken.

中文:如果套件由于異常而退出,并且__exit __()方法的返回值為false,則會重新對異常進(jìn)行重新評估。 如果返回值為true,則異常被抑制,并繼續(xù)執(zhí)行with語句后面的語句。

如果套件由于除了異常之外的任何原因而退出,則__exit __()的返回值將被忽略,并且執(zhí)行將在正常位置繼續(xù)進(jìn)行。

意思就是:

如果是異常退出,那么會返回false,(根據(jù)文檔中的exit的描述“that __exit__() methods should not reraise the passed-in exception; this is the caller’s responsibility.”,大概意思就是exit()不會處理異常,會重新拋出異常拋出給外面,由調(diào)用者處理,因?yàn)檫@是調(diào)用者的責(zé)任)

如果返回 True,則忽略異常,不再對異常進(jìn)行處理【(在exit內(nèi)部處理完異常后,可以讓”__exit__()”方法返回True,此時(shí)該異常就會不會再被拋出,with會認(rèn)為它的執(zhí)行體沒有發(fā)生異常)】

(with會識別返回值,根據(jù)返回值來處理,如果是False,那么with會將執(zhí)行體中的異常拋出,如果是True,那么with會認(rèn)為沒有發(fā)生異常(忽略異常),而繼續(xù)執(zhí)行外面的語句,但由于內(nèi)部調(diào)用的了__exit__(),所以在異常之后的語句是不會運(yùn)行的)

附上一個(gè)文檔中提供的一個(gè)關(guān)于with中使用鎖的例子:

python with語句的原理與用法詳解

幾個(gè)測試:1.執(zhí)行體中發(fā)生異常:

import timeclass myContextDemo(object): def __init__(self,gen): self.gen = gen def __enter__(self): print('enter in ') return self.gen def __exit__(self, exc_type, exc_val, exc_tb):#exc_type是exception_type exc_val是exception_value exc_tb是exception_trackback print('exit in ') if exc_type is None:#如果是None 則繼續(xù)執(zhí)行 print('None:',exc_type, exc_val, exc_tb) else: #異常不為空時(shí)執(zhí)行,這一步,如果with語句體中發(fā)生異常,那么也會執(zhí)行 print('exception:', exc_type, exc_val, exc_tb) print('all done')if __name__=='__main__': gen=(i for i in range(5,10)) G=myContextDemo(gen) with G as f : print('hello') for i in f: print(i,end='t') #測試1:執(zhí)行體中發(fā)生異常 raise Exception('母雞啊') print('main continue')

結(jié)果顯示:python with語句的原理與用法詳解

1.拋出異常后,后面main continue不再執(zhí)行

2.__exit__()中的else會執(zhí)行

測試2:當(dāng)else中強(qiáng)制返回為True時(shí):

import timeclass myContextDemo(object): def __init__(self,gen): self.gen = gen def __enter__(self): print('enter in ') return self.gen def __exit__(self, exc_type, exc_val, exc_tb):#exc_type是exception_type exc_val是exception_value exc_tb是exception_trackback print('exit in ') if exc_type is None:#如果是None 則繼續(xù)執(zhí)行 print('None:',exc_type, exc_val, exc_tb) else: #異常不為空時(shí)執(zhí)行,這一步,如果with語句體中發(fā)生異常,那么也會執(zhí)行 print('exception:', exc_type, exc_val, exc_tb) print('all done') return True #這里如果返回true可以看到發(fā)生異常后,main continue可以執(zhí)行 #即,如果exc_type是true,那么會繼續(xù)執(zhí)行,實(shí)際上,也可以在這里處理一下異常再返回trueif __name__=='__main__': gen=(i for i in range(5,10)) G=myContextDemo(gen) with G as f : print('hello') for i in f: print(i,end='t') raise Exception('母雞啊') # print('continue')#這里不會執(zhí)行 print('main continue')

結(jié)果顯示:python with語句的原理與用法詳解

1.返回True之后,with會忽略異常,繼續(xù)執(zhí)行,所以這里“main continue”能執(zhí)行

2.即使忽略異常,在with體中異常之后的語句依舊不會執(zhí)行

附:理論上可以在返回True之前處理一下異常

PS:如果大家想要了解得更詳細(xì),可以自己嘗試去讀一下官方文檔。

附上關(guān)于with語句的詳細(xì)介紹官方文檔:https://www.python.org/dev/peps/pep-0343/

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python文件與目錄操作技巧匯總》、《Python文本文件操作技巧匯總》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》

希望本文所述對大家Python程序設(shè)計(jì)有所幫助。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产三级一区| 久久久久伊人| 蜜臀91精品国产高清在线观看| 久久三级毛片| 国产精品99一区二区三| 欧美丰满日韩| 高潮久久久久久久久久久久久久| 色偷偷偷在线视频播放 | 亚洲精品进入| 欧美日本三区| 六月婷婷综合| 国产精品三上| 69堂精品视频在线播放| 老鸭窝一区二区久久精品| 特黄毛片在线观看| 伊人精品一区| 亚洲三级精品| 精品免费视频| 夜久久久久久| 欧美日本久久| 日韩综合精品| 中国女人久久久| 欧美精品三级在线| se01亚洲视频 | 国产精品尤物| 99久久九九| 日韩**一区毛片| 电影91久久久| 在线精品一区二区| 91日韩欧美| 天堂av一区| 精品国产18久久久久久二百| 精品一区亚洲| 久久av影视| 美女网站久久| 日韩欧美字幕| 国产日韩一区| 国产视频一区在线观看一区免费| 欧美精品国产一区| 国产在线成人| 精品精品国产三级a∨在线| 久久亚洲国产| 久久久免费人体| 水蜜桃久久夜色精品一区的特点| 岛国精品一区| 日本免费一区二区视频| 国产精品字幕| 久久国产婷婷国产香蕉| 99在线观看免费视频精品观看| 老司机精品在线| 日本亚洲视频| 亚洲欧美一区在线| 欧美aa在线视频| 蜜桃av一区二区| 日韩一区二区三区免费播放| 99视频一区| 午夜精品成人av| 国产精品男女| 蜜桃久久精品一区二区| 久久久噜噜噜| 精品亚洲精品| 日韩一区二区三区在线看| 久久久久国产精品一区二区| 免费观看亚洲天堂| 亚洲婷婷丁香| 狠狠操综合网| 亚洲天堂资源| 图片区亚洲欧美小说区| 色综合狠狠操| 国产经典一区| 天堂va在线高清一区| 日韩在线观看一区二区| 在线成人直播| 久久精品卡一| 欧美日韩视频网站| 成人在线视频中文字幕| 久久国产人妖系列| 亚洲精品九九| 亚洲久草在线| 午夜久久av| 亚洲精品影视| 一区二区三区网站| 蜜臀久久久久久久| 天堂成人免费av电影一区| av中文字幕在线观看第一页| 国产精品v日韩精品v欧美精品网站| 视频一区日韩精品| 亚洲毛片在线免费| 日韩激情网站| 精品国产一级| 国产一区二区三区黄网站 | 国产精品多人| 国产欧美日韩一区二区三区四区| 日韩有吗在线观看| 日韩va亚洲va欧美va久久| 亚洲免费成人av在线| 日韩中文av| 日韩av不卡一区二区| 日韩一区二区三区精品视频第3页| 一区二区精品| 婷婷五月色综合香五月| 日韩综合小视频| 国产精品一在线观看| 国产日产一区| 久久精品亚洲一区二区| 国语精品一区| 日韩精品欧美| 好吊视频一区二区三区四区| 一区二区亚洲视频| 欧美日韩夜夜| 成人午夜在线| 久久国产成人午夜av影院宅| 黄色亚洲在线| 日韩黄色在线观看| 国产精品主播在线观看| 麻豆一区在线| 新版的欧美在线视频| 久久中文字幕av| 99国产精品自拍| 日本一区二区三区中文字幕| 国产精品天天看天天狠| 精品欧美日韩精品| 999精品一区| 蜜臀av在线播放一区二区三区| 日韩午夜视频在线| 麻豆91精品视频| 欧美/亚洲一区| 天堂俺去俺来也www久久婷婷| 欧美精品成人| 精品在线91| 国产欧美日韩在线观看视频| 欧美二三四区| 亚洲三级在线| 久久一区精品| 亚洲欧洲一区| 国产极品一区| 影视先锋久久| 欧美日韩亚洲一区在线观看| 国产日韩电影| 伊人久久大香伊蕉在人线观看热v| 91亚洲无吗| 国产精品99一区二区| 国产日韩欧美三级| 精品日韩毛片| 欧美在线首页| 国产精品91一区二区三区| 日本欧美大码aⅴ在线播放| caoporn视频在线| 三级一区在线视频先锋| 精品中文字幕一区二区三区四区| 婷婷精品视频| 国产欧美一区| 午夜精品亚洲| av资源中文在线天堂| 亚洲a级精品| 久久国产电影| 欧美国产先锋| 日韩精品一二三四| аⅴ资源天堂资源库在线| 亚洲精品极品| 久久久国产精品一区二区中文| 91九色综合| 国产亚洲精品久久久久婷婷瑜伽| 免费在线亚洲| 日韩一区中文| 亚洲免费影院| 国产激情在线播放| 91精品国产自产观看在线| 九九久久婷婷| www.51av欧美视频| 国产精品一国产精品k频道56| 国产精品视区| 久久久国产亚洲精品| 美女视频一区在线观看| 亚洲丝袜啪啪| 99国产成+人+综合+亚洲欧美| 成人国产精选| 久久久精品国产**网站| 一区二区三区午夜视频| 999久久久亚洲| 久久av国产紧身裤| 日本国产亚洲| 首页欧美精品中文字幕| 久久亚洲成人| 久久精品影视| 97精品国产| 国产极品一区| 国产精品麻豆成人av电影艾秋| 综合激情网...| 男女性色大片免费观看一区二区 | 麻豆精品在线| 在线观看亚洲精品福利片| 国精品一区二区| 日韩在线免费| 九九99久久精品在免费线bt| 国产亚洲高清一区| 日本va欧美va瓶| 午夜精品福利影院| 日韩欧美另类中文字幕| 亚洲无线观看|