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

您的位置:首頁技術文章
文章詳情頁

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

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

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

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

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

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

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

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

關于退出返回值:

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,則會重新對異常進行重新評估。 如果返回值為true,則異常被抑制,并繼續執行with語句后面的語句。

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

意思就是:

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

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

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

附上一個文檔中提供的一個關于with中使用鎖的例子:

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

幾個測試:1.執行體中發生異常:

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 則繼續執行 print('None:',exc_type, exc_val, exc_tb) else: #異常不為空時執行,這一步,如果with語句體中發生異常,那么也會執行 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:執行體中發生異常 raise Exception('母雞啊') print('main continue')

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

1.拋出異常后,后面main continue不再執行

2.__exit__()中的else會執行

測試2:當else中強制返回為True時:

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 則繼續執行 print('None:',exc_type, exc_val, exc_tb) else: #異常不為空時執行,這一步,如果with語句體中發生異常,那么也會執行 print('exception:', exc_type, exc_val, exc_tb) print('all done') return True #這里如果返回true可以看到發生異常后,main continue可以執行 #即,如果exc_type是true,那么會繼續執行,實際上,也可以在這里處理一下異常再返回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')#這里不會執行 print('main continue')

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

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

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

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

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

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

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python文件與目錄操作技巧匯總》、《Python文本文件操作技巧匯總》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》

希望本文所述對大家Python程序設計有所幫助。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧洲亚洲一区二区三区| 九一国产精品| 亚洲欧美日韩国产综合精品二区| 99精品在线| 国产99久久| 香蕉久久精品| 日韩毛片视频| 国产在线|日韩| 999久久久91| 蜜桃成人av| 香蕉久久久久久久av网站| 亚洲欧美日韩视频二区| 美女精品在线观看| 免费观看在线综合色| 亚洲欧美日本国产专区一区| 久久亚洲国产精品一区二区| 午夜电影一区| 欧美国产精品| 天堂√中文最新版在线| 欧美特黄a级高清免费大片a级| 亚洲永久字幕| 亚洲久草在线| 国产精品xxx在线观看| 国产一区二区三区亚洲| www成人在线视频| 蜜臀久久久99精品久久久久久| 偷拍亚洲精品| 久久爱www成人| 日韩免费福利视频| 亚洲欧美日韩一区在线观看| 青草国产精品| 色婷婷亚洲mv天堂mv在影片| 欧美99久久| 婷婷视频一区二区三区| 国产精品va| 蜜桃精品在线| 亚洲二区三区不卡| 日韩和欧美一区二区三区| 久久爱www.| 欧美日韩国产一区精品一区| 日韩一区二区三区精品 | 欧美~级网站不卡| 免费欧美在线视频| 久久精品欧洲| 亚洲自拍另类| 精品国产18久久久久久二百| 亚洲特色特黄| 日本成人手机在线| 成人欧美一区二区三区的电影| 五月天激情综合网| 69精品国产久热在线观看| 日韩免费av| 日本欧美一区二区| 日韩高清欧美| 日本成人一区二区| 91精品一区国产高清在线gif| 亚洲aⅴ网站| 香蕉成人av| 91成人在线网站| 999久久久亚洲| 国产亚洲久久| 亚洲香蕉网站| 国产精品久久久久久久久久久久久久久 | 久久电影tv| 日韩影院在线观看| 97精品国产| 日韩精品一区二区三区免费视频 | 亚洲专区视频| 韩国三级一区| 欧美一区=区三区| 亚洲精品1区| 激情久久99| 免费成人性网站| 成人羞羞视频在线看网址| 日韩成人午夜精品| 日韩精品一区二区三区免费观影| 91欧美日韩在线| 91精品国产调教在线观看| 激情婷婷久久| 国内精品99| 亚洲性视频在线| 成人台湾亚洲精品一区二区| 亚洲深深色噜噜狠狠爱网站 | 日本va欧美va瓶| 五月天久久网站| 成人片免费看| 婷婷精品在线观看| 欧美精选一区二区三区| 吉吉日韩欧美| 精品一区二区三区的国产在线观看| 喷白浆一区二区| 国产综合激情| 国产资源在线观看入口av| 国产欧美一级| 亚洲三级在线| 久久高清国产| 欧美日韩高清| 国产一区二区三区四区五区传媒| 只有精品亚洲| 福利精品一区| 日韩一区二区三区高清在线观看 | 久久毛片亚洲| 91精品综合| 久久一区二区中文字幕| 日韩国产一区二| 日韩中文字幕在线一区| 国产毛片久久久| yellow在线观看网址| 日韩国产一二三区| 亚洲人成网77777色在线播放| 日韩视频久久| 国产盗摄——sm在线视频| 欧美片第1页综合| 婷婷国产精品| 亚洲精品123区| 欧美日韩国产高清电影| 青青国产精品| 久久精品 人人爱| 国产精品一区亚洲| 欧美精品影院| 美女国产一区二区三区| 高清一区二区| 精品免费在线| 日韩制服丝袜av| 国产夫妻在线| 国产精品手机在线播放| 9色精品在线| 欧美精品导航| 免费视频一区二区| 水蜜桃精品av一区二区| 国产调教精品| 视频精品一区二区| 国产一区二区三区四区大秀| 日本免费在线视频不卡一不卡二| 欧美专区18| 国产精品毛片aⅴ一区二区三区| 亚洲免费成人| 亚洲一区二区三区中文字幕在线观看| 久久亚洲风情| 日本欧美久久久久免费播放网| 国产精品欧美三级在线观看| 久久亚洲人体| 国产成人免费| 日本中文字幕一区二区视频| 国产资源在线观看入口av| 亚洲精品第一| 日韩一二三区在线观看| 青草久久视频| 精品视频一区二区三区在线观看 | 成人小电影网站| 久久久天天操| 国产精品地址| 日韩精品视频网| 国产精品蜜芽在线观看| 久久精品一区| 成人精品久久| 97人人精品| 免费久久精品| 中文字幕中文字幕精品| 欧美日韩在线精品一区二区三区激情综合 | 人人香蕉久久| 国产一区二区精品| 日本不卡视频一二三区| 欧美精品不卡| 久久在线免费| 日韩精品视频一区二区三区| 欧美激情福利| 日韩在线短视频| 午夜一级久久| 国产精品探花在线观看| 久久免费国产| 日韩有吗在线观看| 91亚洲一区| 久久亚洲一区| 精品国产a一区二区三区v免费| av一区二区高清| 日本视频在线一区| 亚洲精品一级二级| 免费在线欧美视频| 精品淫伦v久久水蜜桃| 日韩美女精品| 91精品蜜臀一区二区三区在线| 亚洲一区二区小说| 精品网站aaa| 伊人国产精品| 日韩免费视频| 日本一区二区三区视频在线看| 国产h片在线观看| 亚洲v天堂v手机在线| 日韩欧美一区二区三区免费看| 中文字幕一区二区av| 国产精品毛片一区二区在线看| 热久久国产精品| 日韩免费久久| 国产精品一线天粉嫩av| 亚洲欧美日韩国产综合精品二区| 精品三级av| 亚洲ww精品| 精品国模一区二区三区| 国产亚洲欧美日韩在线观看一区二区|