中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python with和上下文管理工具怎么用

發布時間:2022-02-21 15:14:13 來源:億速云 閱讀:105 作者:iii 欄目:開發技術

這篇文章主要介紹了Python with和上下文管理工具怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python with和上下文管理工具怎么用文章都會有所收獲,下面我們一起來看看吧。

前言

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

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

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

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

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

普通版

def test1():

    f = open("output.txt", "w")

    f.write("python之禪")

    f.close()

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

進階版

def test2():

    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 test3():

    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()

__enter__() 方法返回資源對象,這里就是你將要打開的那個文件對象,__exit__() 方法處理一些清除工作。

因為 File 類實現了上下文管理器,現在就可以使用 with 語句了。

with File('out.txt', 'w') as f:

    print("writing")

    f.write('hello, python')

這樣,你就無需顯式地調用 close 方法了,由系統自動去調用,哪怕中間遇到異常,close 方法也會被調用。

contextlib

Python 還提供了一個 contextmanager 的裝飾器,更進一步簡化了上下文管理器的實現方式。通過 yield 將函數分割成兩部分,yield 之前的語句在 __enter__ 方法中執行,yield 之后的語句在 __exit__ 方法中執行。緊跟在 yield 后面的值是函數的返回值。 

from contextlib import contextmanager

@contextmanager

def my_open(path, mode):

    f = open(path, mode)

    yield f

    f.close()

調用:

with my_open('out.txt', 'w') as f:

    f.write("hello , the simplest context manager")

關于“Python with和上下文管理工具怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Python with和上下文管理工具怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

堆龙德庆县| 浙江省| 舞阳县| 白水县| 黄山市| 杨浦区| 白朗县| 庄河市| 柳江县| 抚远县| 米脂县| 喀喇沁旗| 花莲市| 淮南市| 习水县| 嘉义市| 灌南县| 龙口市| 遂平县| 罗城| 曲周县| 大安市| 维西| 玛沁县| 玛曲县| 聂拉木县| 布尔津县| 双柏县| 珠海市| 宁都县| 读书| 彰化县| 青神县| 全椒县| 宜兰市| 溆浦县| 鄂托克旗| 通海县| 尚义县| 泸溪县| 长白|