电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:29日期: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 編程
相關文章:
主站蜘蛛池模板: H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 分光色差仪,测色仪,反透射灯箱,爱色丽分光光度仪,美能达色差仪维修_苏州欣美和仪器有限公司 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 成都思迪机电技术研究所-四川成都思迪编码器 | 盐城网络公司_盐城网站优化_盐城网站建设_盐城市启晨网络科技有限公司 | 节流截止放空阀-不锈钢阀门-气动|电动截止阀-鸿华阀门有限公司 | 淘趣英语网 - 在线英语学习,零基础英语学习网站 | 博医通医疗器械互联网供应链服务平台_博医通 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 工业风机_环保空调_冷风机_工厂车间厂房通风降温设备旺成服务平台 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 灌装封尾机_胶水灌装机_软管灌装封尾机_无锡和博自动化机械制造有限公司 | LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 商标转让-商标注册-商标查询-软著专利服务平台 - 赣江万网 | 挤塑板-XPS挤塑板-挤塑板设备厂家[襄阳欧格]| 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 江西高职单独招生-江西单招考试-江西高职单招网 | 桂林腻子粉_内墙外墙抗裂砂浆腻子粉推荐广西鑫达涂料厂家供应 | 中细软知识产权_专业知识产权解决方案提供商 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | 北京发电机出租_发电机租赁_北京发电机维修 - 河北腾伦发电机出租 | 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 上海网站建设-上海网站制作-上海网站设计-上海做网站公司-咏熠软件 | 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 迪威娱乐|迪威娱乐客服|18183620002| 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 |