python學習 上下文管理,with語句

2021-10-05 09:30:50 字數 2658 閱讀 5767

參考:

gluon的乙個例子: # _recordingstatescope 函式

with的語法

with expr as var:

block

上面的語法的偽**

mgr =

(expr)

exit =

type

(mgr)

.__exit__ # not calling it yet,還沒有執行

value =

type

(mgr)

.__enter__(mgr)

exc =

true

try:

try:

var = value # only if "as var" is present

block

except

:# the exceptional case is handled here

exc =

false

ifnot exit(mgr,

*sys.exc_info())

:raise

# the exception is swallowed if exit() returns true

finally

:# the normal and non-local-goto cases are handled here

if exc:

exit(mgr,

none

,none

,none

)

對上面的偽**的乙個解析:

生成上下文管理器mgr。

第2,3行會檢查是否有 __exit__ 和 __enter__,沒有的化,會丟擲attributeerror異常。

將__enter__的值賦值給value;這個時候會呼叫__enter__並執行,__exit__還不會執行。

如果語法中沒有寫 as var,那麼 var = value 就被忽略。

執行block內的**:正常結束,或者是通過break, continue, return來結束;然後執行__exit__內的**,__exit__的三個引數都是none,__exit__引數分別是:異常型別,異常值,追溯資訊。

如果執行出現異常,執行except中的語句,呼叫__exit__時的引數就是sys.exc_info() #(exc_type, exc_value, exc_traceback)

注意:如果 __enter__ 沒有返回值,那麼 as 物件獲取的值就是none

class

withtest

:def

__init__

(self, filename)

: self.filename=filename

def__enter__

(self)

: self.f =

open

(self.filename,

'r')

# return self.f

def__exit__

(self, exc_type, exc_val, exc_tb)

: self.f.close(

)test = withtest(

'file'

)with test as t:

print

('test result: {}'

.format

(t))

輸出結果:

test result: none
這個例子裡面__enter__沒有返回,所以with語句裡的"as t"到的是none,修改一下上面的例子:

class

withtest

:def

__init__

(self, filename)

: self.filename=filename

def__enter__

(self)

: self.f =

open

(self.filename,

'r')

return self.f

def__exit__

(self, exc_type, exc_val, exc_tb)

: self.f.close(

)test = withtest(

'file'

)with test as t:

print

('test result: {}'

.format

(t))

輸出:

__enter__函式裡有返回值賦值給as的物件t。

正常來講,在block發生的錯誤會被傳到__exit__的引數裡,如果block**沒有發生錯誤,那麼傳入的三個引數就none,如果發生了錯誤,那麼傳入__exit__的引數就是:錯誤型別,錯誤值,和追溯資訊,並且__exit__返回值為false的情況下才會觸發 raise,丟擲異常資訊。

因此,如果在__exit__中返回true,即使block**出現了錯誤,但仍然不會產生異常。

python上下文管理

重寫 enter 方法,返回值會被 as 捕獲 重寫 exit 方法 democlass mycontextmanager def enter self print 進入管理器範圍執行方法 此處的返回值會被 with xx as 捕獲 return 退出上下文管理範圍執行方法,即使中間報錯也會執行 ...

python 高階 with 上下文管理

with 上下文管理器 語法糖 python 提供的一種簡化語法,在編寫 時更加簡潔 with 就是眾多語法糖中的一種 with 執行原理 能通過with進行執行的語句,都是實現了上下文管理器 上下文管理器中包含兩個魔法方法 enter 和 exit enter 方法提供環境的初始化操作 exit ...

python 上下文管理協議

class open def init self,name self.name name def enter self print 出現with語句,物件的 enter 被觸發,有返回值則賦值給as宣告的變數 return self def exit self,exc type,exc val,ex...