python上下文管理協議,即with的詳細使用
阿新 • • 發佈:2018-03-11
self. workspace als 部分 觸發 fin 自動清理 all int
一、with obj as f:
#代碼塊...
二、執行流程:
1.with obj --->觸發obj.__enter__(),需要在obj裏寫__enter__(self),在它裏邊寫返回值,返回給 as f
2.with obj as f 等同於 f = obj.__enter__()
3.執行with代碼塊裏的程序
4.執行正常時,順序執行obj中的__exit__()方法,exc_type, exc_val, exc_tb的值都是None.
存在異常時,__exit__()方法中
a. return False返回假時,拋出系統異常。
b. return True 返回假時,吞掉系統異常,自己定制異常信息。
三、它的作用:自動清理/釋放代碼塊中程序占用的資源,無須考慮這些問題
class Foo: def __init__(self,aa): self.aa = aa def __enter__(self): print(‘run enter‘) return self def __exit__(self, exc_type, exc_val, exc_tb): print(‘run exit‘) print(exc_type)#異常類 如:NameError print(exc_val)#異常值 如:name ‘myname‘ is not defined print(exc_tb)#追蹤信息 如:Traceback (most recent call last): xxxx return True with Foo(11) as cc: print(cc.aa) print(cc.ff) print(‘ssss‘)
常見的異常組成部分
Traceback (most recent call last):(追蹤信息開始)
File "D:/workSpace/purePython3/異常.py", line 1, in <module>
myname(追蹤信息結束)
NameError(異常類): name ‘myname‘ is not defined(異常值)
python上下文管理協議,即with的詳細使用