国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

正確理解python中的關鍵字“with”與上下文管理器

2020-02-23 04:35:48
字體:
來源:轉載
供稿:網友

前言

如果你有閱讀源碼的習慣,可能會看到一些優秀的代碼經常出現帶有 “with” 關鍵字的語句,它通常用在什么場景呢?今天就來說說 with 和 上下文管理器。

對于系統資源如文件、數據庫連接、socket 而言,應用程序打開這些資源并執行完業務邏輯之后,必須做的一件事就是要關閉(斷開)該資源。

比如 Python 程序打開一個文件,往文件中寫內容,寫完之后,就要關閉該文件,否則會出現什么情況呢?極端情況下會出現 "Too many open files" 的錯誤,因為系統允許你打開的最大文件數量是有限的。

同樣,對于數據庫,如果連接數過多而沒有及時關閉的話,就可能會出現 "Can not connect to MySQL server Too many connections",因為數據庫連接是一種非常昂貴的資源,不可能無限制的被創建。

來看看如何正確關閉一個文件。

普通版:

def m1(): f = open("output.txt", "w") f.write("python之禪") f.close()

這樣寫有一個潛在的問題,如果在調用 write 的過程中,出現了異常進而導致后續代碼無法繼續執行,close 方法無法被正常調用,因此資源就會一直被該程序占用者釋放。那么該如何改進代碼呢?

進階版:

def m2(): f = open("output.txt", "w") try: f.write("python之禪") except IOError: print("oops error") finally: f.close()

改良版本的程序是對可能發生異常的代碼處進行 try 捕獲,使用 try/finally 語句,該語句表示如果在 try 代碼塊中程序出現了異常,后續代碼就不再執行,而直接跳轉到 except 代碼塊。而無論如何,finally 塊的代碼最終都會被執行。因此,只要把 close 放在 finally 代碼中,文件就一定會關閉。

高級版:

def m3(): with open("output.txt", "w") as f: f.write("Python之禪")

一種更加簡潔、優雅的方式就是用 with 關鍵字。open 方法的返回值賦值給變量 f,當離開 with 代碼塊的時候,系統會自動調用 f.close() 方法, with 的作用和使用 try/finally 語句是一樣的。那么它的實現原理是什么?

在講 with 的原理前要涉及到另外一個概念,就是上下文管理器(Context Manager)。

上下文管理器

任何實現了 __enter__() __exit__() 方法的對象都可稱之為上下文管理器,上下文管理器對象可以使用 with 關鍵字。顯然,文件(file)對象也實現了上下文管理器。

那么文件對象是如何實現這兩個方法的呢?我們可以模擬實現一個自己的文件類,讓該類實現 __enter__() __exit__() 方法。

class File(): def __init__(self, filename, mode): self.filename = filename self.mode = mode def __enter__(self): print("entering") self.f = open(self.filename, self.mode) return self.f def __exit__(self, *args): print("will exit") self.f.close()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永昌县| 沁水县| 霞浦县| 合山市| 龙山县| 织金县| 伊宁市| 大连市| 开江县| 邵阳市| 远安县| 腾冲县| 凌源市| 普安县| 阿合奇县| 德安县| 策勒县| 太仆寺旗| 荥经县| 靖边县| 肃北| 怀安县| 长岭县| 山西省| 吕梁市| 宁武县| 施秉县| 绍兴县| 安徽省| 扎赉特旗| 株洲县| 应用必备| 边坝县| 区。| 栾川县| 顺平县| 广河县| 临潭县| 汉阴县| 浏阳市| 侯马市|