之前再遇到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...