一、語法
with context as var:
with_suite
with語句
:可以代替try…except…finally語句,使代碼更加簡潔;
context
:通常是表達式,返回一個對象;
var變量
:用來保存context返回的對象,可以是單個值或元組;
with_suite
:使用變量var對context返回對象進行各種操作的代碼段
二、示例
查看文件內容
XZ:learn xz$ cat with.txt
with...as...
12345
abcde
In [2]: with open('with.txt','r+') as f:
...: for line in f.readlines():
...: print(line)
...: print('with is closed : ', f.closed)
...:
...:
with...as...
12345
abcde
with is closed : True
打開文本with.txt,f變量接收文件對象返回的對象;
讀取文本中的內容,逐行打印;
with中的代碼執行完成後,會自動關閉文件;
如果with語句中沒有做try…except異常處理,出現錯誤時會直接將異常交給Python解釋器拋出,不會自動關閉文件,如果做了try…except異常處理,出現異常時,會自動關閉文件,再拋出異常。
三、原理
1、with語句實質上是上下文管理
- 上下文管理協議:包含2個方法:enter__和__exit;
- 支持該協議的對象,要實現這2個方法,才能被with語句進行操作。
2、上下文管理器
- 定義執行with語句時建立的運行時上下文,負責執行with語句上下文的進入和退出操作;
- 進入上下文管理器:調用管理器__enter__方法,如果設置了as var語句,變量var接受__enter__方法的返回值;
- 退出上下文管理器:調用管理器的__exit__方法。
四、應用場景
1、文件操作
2、進程線程之間互斥對象,如互斥鎖
3、自定義的支持上下文的其它操作