老狗——Python中的With...as語句

一、語法

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、自定義的支持上下文的其它操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章