Pyhton提高 with上下文管理器

2021-08-28 12:11:09 字數 2476 閱讀 1587

with 語句是 pyhton 上的一種簡化語法,with 語句是從 python 2.5 開始引入的一種與異常處理相關的功能。with 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必需的「清理」操作,釋放資源。比如檔案使用後自動關閉、資料庫的開啟和自動關閉等。

語法格式是這樣的:

with open('test', 'w') as f:

f.write('python**好')

通過 with 語句在編寫**時,會使**變得更加簡潔。在編寫**時,不用再顯示的去關閉檔案。

語句的執行過程:

1.在執行 with 語句時,首先執行 with 後面的 open **

2.執行完**後,會將**的結果通過 as 儲存到 f 中

3.然後在下面實現真正要執行的操作

4.在操作後面,並不需要寫檔案的關閉操作,檔案會在使用完後自動關閉

實際上,在檔案操作時,並不是不需要寫檔案的關閉,而是檔案的關閉操作在 with 的上下文管理器中的協議方法裡已經寫好了。

當檔案操作執行完成後, with語句會自動呼叫上下文管理器裡的關閉語句來關閉檔案資源。

with 語句在執行時,需要呼叫上下文管理器中的enterexit兩個方法。

enter方法會在執行 with 後面的語句時執行,一般用來處理操作前的內容。比如一些建立物件,初始化等。

exit方法會在 with 內的**執行完畢後執行,一般用來處理一些善後收尾工作,比如檔案的關閉,資料庫的關閉等。

在自定義上下文管理器時,只需要在類中實現enterexit兩個方法即可。

模擬檔案開啟過程:

import time

class myopen(object):

def __init__(self,file, mode):

self.__file = file

self.__mode = mode

def __enter__(self):

print('__enter__ run ... 開啟檔案')

self.__handle = open(self.__file, self.__mode)

return self.__handle

def __exit__(self, exc_type, exc_val, exc_tb):

print('__exit__... run ... 關閉檔案')

self.__handle.close()

with myopen('test','w') as f:

f.write('python **好')

time.sleep(3)

print('over')

程式執行結果:

__enter__ run ... 開啟檔案

__exit__ run ... 關閉檔案

over

exit方法中有三個引數,用來接收處理異常,如果**在執行時發生異常,異常會被儲存到這裡。

class mycount(object):

def __init__(self, x, y):

self.__x = x

self.__y = y

def __enter__(self):

return self

def __exit__(self, exc_type, exc_val, exc_tb):

# 通過 引數接收到的值,來判斷程式執行是否出現異常

# 如果是 none ,說明沒有異常

if exc_type == none:

print('計算正確執行')

else:

# 否則出現異常,可以選擇怎麼處理異常

print(exc_type,exc_val)

# 返回值決定了捕獲的異常是否繼續向外丟擲

# 如果是 false 那麼就會繼續向外丟擲,程式會看到系統提示的異常資訊

# 如果是 true 不會向外丟擲,程式看不到系統提示資訊,只能看到else中的輸出

return true

def div(self):

print(self.__x / self.__y)

with mycount(6, 0) as mc:

mc.div()

在 __exit__函式執行異常處理時,會根據函式的返回值決定是否將系統丟擲的異常繼續向外丟擲。

如果返回值為 false 就會向外丟擲,使用者就會看到。 如果返回值為 true 不會向外丟擲,可以將異常顯示為更加友好的提示資訊。

Pyhton提高 with上下文管理器

with 語句是 pyhton 上的一種簡化語法,with 語句是從 python 2.5 開始引入的一種與異常處理相關的功能。with 語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必需的 清理 操作,釋放資源。比如檔案使用後自動關閉 資料庫的開啟和自動關閉等。語法格式是這...

上下文 上下文棧

全域性 函式 區域性 在執行全域性 前將window確定為全域性執行上下文 對全域性資料進行預處理 var定義的全域性變數 undefined,新增為window的屬性 function宣告的全域性函式 賦值 fun 新增為window的方法 this 賦值 window 開始執行全域性 在呼叫函式...

中斷上下文 程序上下文

在學習與作業系統相關的知識時候,我們經常遇到程序上下文 中斷上下文,看似熟悉又感覺不是特別清晰。這裡我們從如下幾個方面進行描述。上下文是從英文中context翻譯過來的,指的是一種環境。上下文我們看起來不怎麼熟悉,但是我們可以看context的中文翻譯,或者我們能更加的情形些。context n 語...