老衛帶你學 PYTHON之WITH語句原理

2021-10-23 14:47:36 字數 1954 閱讀 2302

我們看乙個with處理檔案操作的例項:

with

open

('/etc/passwd'

)as f:

for line in f:

print

(line)

這段**的作用:開啟乙個檔案,如果一切正常,把檔案物件賦值給f,然後用迭代器遍歷檔案中每一行,當完成時,關閉檔案;

而無論在這段**的任何地方,如果發生異常,此時檔案仍會被關閉。

with看起來如此簡單,但是其背後還有一些工作要做,因為你不能對python的任意物件使用with語句,它僅能工作於支援上下文管理協議(context management protocol)的物件。

也就是說,只有內建了「上下文管理」的物件可以和with一起工作,目前支援該協議的物件有:

當with語句執行時,便執行上下文表示式(context_expr)來獲得乙個上下文管理器,上下文管理器的職責是提供乙個上下文物件,用於在with語句塊中處理細節:

一旦獲得了上下文物件,就會呼叫它的__enter__()方法,將完成with語句塊執行前的所有準備工作,如果with語句後面跟了as語句,則用__enter__()方法的返回值來賦值;

當with語句塊結束時,無論是正常結束,還是由於異常,都會呼叫上下文物件的__exit__()方法,exit()方法有3個引數,如果with語句正常結束,三個引數全部都是 none;如果發生異常,三個引數的值分別等於呼叫sys.exc_info()函式返回的三個值:型別(異常類)、值(異常例項)和跟蹤記錄(traceback),相應的跟蹤記錄物件。

因為上下文管理器主要作用於共享資源,enter()和__exit__()方法幹的基本是需要分配和釋放資源的低層次工作,

比如:資料庫連線、鎖分配、訊號量加/減、狀態管理、檔案開啟/關閉、異常處理等。

知道了上面這些,我們就可以嘗試在自定義類裡面建立__enter__()和__exit__()方法,來配合with語句建立類例項了:

另外python庫中還有乙個模組contextlib,使你不用構造含有__enter__, __exit__的類就可以使用with:

老衛帶你學 python裝飾器

python的裝飾器,就是在不修改原有 的基礎上,增加額外的功能 假如我們原有乙個函式,這個函式它的功能是尋找1 n範圍內的偶數 def func for i in range 1000 if i 2 0 print i r func 此時列印如下 988990 992994 996998.那如果我...

老衛帶你學 numpy集合運算

集合運算 2018 11 11 1.np.unique 唯一值 它用幹找出陣列中的唯一值並返回已排序的結果 names np.array bob joe will bob np.unique names array bob will bob joe dtype sorted set names 等價...

老衛帶你學 小汪換道具

給定三個類別的物品,分別有a,b,c個。a,b,c 三個物品一起可以換乙個獎品,另外任意兩個物品可以換任意乙個物品,求最大可以兌換多少個獎品 輸入 4,4,2 輸出 主要思路就是先減去直接換的,然後排序,此時a 0,分為兩種情況,b,c給a,以及c給b和a。class solution def nu...