Python中with的用法

2021-08-21 03:40:54 字數 2208 閱讀 4134

之前再遇到with語句在檔案操作上的用法非常巧妙,以前不太熟悉,看的時候也產生一些困惑

有一些任務,可能事先需要設定,事後做清理工作。對於這種場景,python的with語句提供了一種非常方便的處理方式。其中乙個很好的例子是檔案處理,你需要獲取乙個檔案控制代碼,從檔案中讀取資料,然後關閉檔案控制代碼。

如果不用with語句,**如下:

file = open("/tmp/foo.txt")

data = file.read()

file.close()

這裡有兩個問題。一是可能忘記關閉檔案控制代碼;二是檔案讀取資料發生異常,沒有進行任何處理。下面是處理異常的加強版本:

file = open("/tmp/foo.txt")

try:

data = file.read()

finally:

file.close()

這段**執行良好,但是太冗長。這時候with便體現出了優勢。 除了有更優雅的語法,with還可以很好的處理上下文環境產生的異常。下面是with版本的**:

with

open("/tmp/foo.txt") as

file:

data = file.read()

是不是很簡單?

但是如果對with工作原理不熟悉的通許可能會和剛才的我一樣,不懂其中原理

那麼下面我們簡單看一下with的工作原理

基本思想是:with所求值的物件必須有乙個enter()方法,乙個exit()方法。

緊跟with**後面的語句被求值後,返回物件的**__enter__()方法被呼叫,這個方法的返回值將被賦值給as後面的變數。當with後面的**塊全部被執行完之後,將呼叫前面返回物件的exit()方法。

下面是乙個例子

######################

########with()##########

######################

class

sample:

def__enter__

(self):

print("in __enter__")

return

"foo"

def__exit__

(self, exc_type, exc_val, exc_tb):

#exc_type: 錯誤的型別

#exc_val: 錯誤型別對應的值

#exc_tb: **中錯誤發生的位置

print("in __exit__")

defget_sample

():return sample()

with get_sample() as sample:

print("sample: " ,sample)

執行**,輸出如下

分析執行過程:

進入這段程式,首先建立sample類,完成它的兩個成員函式enter()、exit()的定義,然後順序向下定義get_sample()函式.

進入with語句,呼叫get_sample()函式,返回乙個sample()類的物件,此時就需要進入sample()類中,可以看到

1. __enter__()方法先被執行

2. __enter__()方法返回的值 - 這個例子中是"foo",賦值給變數'sample'

3. 執行with中的**塊,列印變數"sample",其值當前為 "foo"

4. 最後__exit__()方法被呼叫

完整執行細節的除錯過程請看gif:

這裡只做了有限的簡單說明,關於python中with用法詳細參考:

** python 的 with 語句

python的with用法

python中with的用法

剛剛開始學python,今天在乙個基礎例子中看到了一行 覺得很有意思,就去研究了一下 with open config name login.txt r as f 其實這是python中的with語句,類似於php中的try catch 主要是用來檔案處理,你需要的是獲取乙個檔案控制代碼,然後從檔案...

python中with的用法

python中with的用法 清單 1.with 語句的語法格式 1 2 with context expression as target s with body 無論context expression是否發生異常,都能保證不報錯,類似於try finally正規化。enter 語句返回值賦給t...

python中 的用法

在python的函式中偶爾會看到函式定義的上一行有 functionname的修飾,當直譯器讀到 這樣的修飾符的時候會優先解除 後的內容,直接就把 的下一行的函式或者類作為 後邊函式的引數,然後將返回值賦給下乙個修飾的函式物件。示例 def function 1 a print function 1...