Python 筆記(3)--with 的原理
原文網址:https://openhome.cc/Gossip/Python/WithAs.html
file = open('demo.py', 'r', encoding='UTF-8') try: for line in file: print(line, end='') except: print('讀取檔案發生錯誤') finally: file.close()
為了要處理檔案讀取過程中發生的例外,並且最後確定檔案一定會關閉,你使用了try..except...finally語句,實際上,在Python 3(或2.6)中,你可以使用with as語句來簡化程式的撰寫。
with open('demo.py', 'r', encoding='UTF-8') as file: for line in file: print(line, end='')
實際上,只要物件支援環境管理協定(Context Management Protocol),就可以使用with as語句。支援環境管理協定的物件,必須實作__enter__()與__exit__()兩個方法,這樣的物件稱之為環境管理員(Context Manager)。 with陳述句一開始執行,就會進行__enter__()方法,該方法傳回的物件,可以使用as指定給變數(如果有的話),接著就執行with區塊中的程式碼。 如果with區塊中的程式碼發生了例外,則會執行__exit__()方法,並傳入三個引數,這三個引數,與 再看 try、raise 中所提到的 sys.exc_info() 傳回的三個值是相同的,也就是例外的類型、例 外訊息以及traceback物件。此時__exit__()方法若傳回False,則例外會被重新丟出,否則例外就停止傳播,通常__exit__()會傳回False以在with之外還可以處理例外。 如果with區塊中沒有發生例外而執行完畢,則也是執行__exit__()方法,此時__exit__()的三個參數都接收到None。
因此,Python的with語句是提供一個有效的機制,讓程式碼更簡練,同時在異常產生時,清理工作更簡單。











