AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Python上下文管理,你真的了解嗎?

來源: 責編: 時間:2023-12-11 09:28:54 271觀看
導讀在 Python 編程中,有效地管理資源和處理異常是至關重要的。上下文管理器作為一種強大的工具,提供了一種優雅的方式來管理資源,確保它們在使用完畢后能夠被正確釋放。通過結合 with 語句,上下文管理器使得資源的獲取和釋放

在 Python 編程中,有效地管理資源和處理異常是至關重要的。上下文管理器作為一種強大的工具,提供了一種優雅的方式來管理資源,確保它們在使用完畢后能夠被正確釋放。通過結合 with 語句,上下文管理器使得資源的獲取和釋放變得簡單而可靠,同時也使得異常處理變得更加優雅和簡潔。本文將深入探討 Python 中的上下文管理器,介紹其概念、用法和實際應用,并提供豐富的代碼示例,幫助讀者更好地理解和運用這一強大的特性。pGv28資訊網——每日最新資訊28at.com

當談論 Python 中的上下文管理時,我們通常是指 with 語句和上下文管理器。上下文管理器可以讓我們更方便地管理資源,比如文件、網絡連接或者數據庫連接,同時也可以確保資源在使用完畢后得到正確的清理和釋放。在本文中,我將詳細介紹上下文管理器的概念、用法和實例,并提供豐富的代碼示例。pGv28資訊網——每日最新資訊28at.com

pGv28資訊網——每日最新資訊28at.com

一、什么是上下文管理器?

在 Python 中,上下文管理器是指實現了 __enter__ 和 __exit__ 方法的對象。當我們使用 with 語句時,會調用上下文管理器的 __enter__ 方法獲取資源,然后在 with 代碼塊執行結束后,無論是正常結束還是出現異常,都會調用 __exit__ 方法來進行清理和釋放資源。pGv28資訊網——每日最新資訊28at.com

上下文管理器可以用于許多場景,比如文件操作、線程鎖、數據庫連接等,它們能夠確保資源的正確管理和釋放,避免出現資源泄漏等問題。pGv28資訊網——每日最新資訊28at.com

一個上下文管理器的類,最起碼要定義 __enter__ 和 exit 方法。 讓我們來構造我們自己的開啟文件的上下文管理器,并學習下基礎知識。pGv28資訊網——每日最新資訊28at.com

class File(object):    def __init__(self, file_name, method):        self.file_obj = open(file_name, method)    def __enter__(self):        return self.file_obj    def __exit__(self, type, value, traceback):        self.file_obj.close()

pGv28資訊網——每日最新資訊28at.com

通過定義 __enter__ 和 __exit__ 方法,我們可以在with語句里使用它。我們來試試:pGv28資訊網——每日最新資訊28at.com

with File('demo.txt', 'w') as opened_file:    opened_file.write('Hola!')

pGv28資訊網——每日最新資訊28at.com

我們的 __exit__ 函數接受三個參數。這些參數對于每個上下文管理器類中的 __exit__ 方法都是必須的。我們來談談在底層都發生了什么。pGv28資訊網——每日最新資訊28at.com

  • with 語句先暫存了 File 類的 __exit__ 方法。
  • 然后它調用 File 類的 __enter__ 方法。
  • __enter__ 方法打開文件并返回給 with 語句。
  • 打開的文件句柄被傳遞給 opened_file 參數。
  • 我們使用 .write() 來寫文件。
  • with 語句調用之前暫存的 __exit__ 方法。
  • __exit__ 方法關閉了文件。

二、實現上下文管理器

我們也可以自定義上下文管理器,只需實現 __enter__ 和 __exit__ 方法即可。pGv28資訊網——每日最新資訊28at.com

  1. 基礎實現
python復制代碼class MyContextManager:    def __enter__(self):        print('Entering the context')        # 返回需要被管理的資源        return self    def __exit__(self, exc_type, exc_value, traceback):        print('Exiting the context')        # 在退出上下文時進行清理工作# 使用自定義的上下文管理器with MyContextManager() as manager:    # 在這個代碼塊中使用 manager 管理的資源    pass

2. 嵌套使用

上下文管理器可以進行嵌套使用,這樣可以方便地管理多個資源。上下文管理器的嵌套使用可以幫助我們方便地管理多個資源。這種嵌套使用可以確保資源的正確獲取和釋放,使代碼更加清晰和易于維護。這里有一個示例,演示了如何嵌套使用多個上下文管理器:pGv28資訊網——每日最新資訊28at.com

class DatabaseConnection:    def __enter__(self):        print('Opening database connection')        # 假設這里是連接數據庫的代碼        return self    def __exit__(self, exc_type, exc_value, traceback):        print('Closing database connection')        # 假設這里是關閉數據庫連接的代碼class FileOperation:    def __enter__(self):        print('Opening file')        # 假設這里是打開文件的代碼        return self    def __exit__(self, exc_type, exc_value, traceback):        print('Closing file')        # 假設這里是關閉文件的代碼# 嵌套使用上下文管理器with DatabaseConnection() as db_connection:    with FileOperation() as file:        # 執行需要同時使用數據庫連接和文件的操作        pass

pGv28資訊網——每日最新資訊28at.com

在這個示例中,我們嵌套使用了 `DatabaseConnection` 和 `FileOperation` 兩個上下文管理器,這樣可以確保在操作完成后,數據庫連接和文件都能被正確地關閉。pGv28資訊網——每日最新資訊28at.com

嵌套使用上下文管理器使得我們能夠更加靈活地管理多個資源,確保資源的獲取和釋放都能得到正確處理。這種方式使得代碼的可讀性更強,同時也降低了出錯的可能性。pGv28資訊網——每日最新資訊28at.com

希望這個示例能夠幫助您更好地理解上下文管理器的嵌套使用。pGv28資訊網——每日最新資訊28at.com

三、上下文管理器的應用

pGv28資訊網——每日最新資訊28at.com

1. 文件操作

使用 with 語句管理文件資源pGv28資訊網——每日最新資訊28at.com

with open('example.txt', 'r') as f:    for line in f:        print(line)# 文件在 with 代碼塊結束后自動關閉

pGv28資訊網——每日最新資訊28at.com

2. 線程鎖

pGv28資訊網——每日最新資訊28at.com

import threadinglock = threading.Lock()with lock:    # 執行需要進行線程同步的操作    pass# 線程鎖在 with 代碼塊結束后自動釋放

3. 數據庫連接

import pymysqlclass DBConnection:    def __enter__(self):        self.conn = pymysql.connect(host='localhost', user='user', password='password', db='test_db')        self.cursor = self.conn.cursor()        return self.cursor    def __exit__(self, exc_type, exc_value, traceback):        self.cursor.close()        self.conn.close()with DBConnection() as cursor:    cursor.execute('SELECT * FROM example_table')    # 執行數據庫操作# 數據庫連接在 with 代碼塊結束后自動關閉

4. 異常處理

我們還沒有談到 __exit__ 方法的這三個參數:type,value 和 traceback。 在第4步和第6步之間,如果發生異常,Python 會將異常的 type,value 和 traceback 傳遞給 __exit__ 方法。 它讓 __exit__ 方法來決定如何關閉文件以及是否需要其他步驟。在我們的案例中,我們并沒有注意它們。pGv28資訊網——每日最新資訊28at.com

那如果我們的文件對象拋出一個異常呢?萬一我們嘗試訪問文件對象的一個不支持的方法。舉個例子:pGv28資訊網——每日最新資訊28at.com

with File('demo.txt', 'w') as opened_file:    opened_file.undefined_function('Hola!')

我們來列一下,當異常發生時,with 語句會采取哪些步驟:pGv28資訊網——每日最新資訊28at.com

  • 它把異常的 type,value 和 traceback 傳遞給 __exit__方法。
  • 它讓 __exit__ 方法來處理異常。
  • 如果 __exit__ 返回的是 True,那么這個異常就被優雅地處理了。
  • 如果 __exit__ 返回的是 True 以外的任何東西,那么這個異常將被 with 語句拋出。

在我們的案例中,__exit__ 方法返回的是 None (如果沒有 return 語句那么方法會返回 None)。因此,with 語句拋出了那個異常。pGv28資訊網——每日最新資訊28at.com

Traceback (most recent call last):File "<stdin>", line 2, in <module>AttributeError: 'file' object has no attribute 'undefined_function'

pGv28資訊網——每日最新資訊28at.com

我們嘗試下在 exit 方法中處理異常:pGv28資訊網——每日最新資訊28at.com

class File(object):    def __init__(self, file_name, method):        self.file_obj = open(file_name, method)    def __enter__(self):        return self.file_obj    def __exit__(self, type, value, traceback):        print("Exception has been handled")        self.file_obj.close()        return Truewith File('demo.txt', 'w') as opened_file:    opened_file.undefined_function()# Output: Exception has been handled

pGv28資訊網——每日最新資訊28at.com

我們的 `__exit__` 方法返回了 `True`,因此沒有異常會被 `with` 語句拋出。pGv28資訊網——每日最新資訊28at.com

這還不是實現上下文管理器的唯一方式。還有一種方式,我們會在下一節中一起看看。pGv28資訊網——每日最新資訊28at.com

pGv28資訊網——每日最新資訊28at.com

上下文管理器在異常處理方面也非常有用,當 with 代碼塊中出現異常時,上下文管理器的 __exit__ 方法會被調用,這樣我們可以在 exit 方法中處理異常并進行資源的釋放和清理。pGv28資訊網——每日最新資訊28at.com

class MyContextManager:    def __enter__(self):        print('Entering the context')        return self    def __exit__(self, exc_type, exc_value, traceback):        print('Exiting the context')        if exc_type is not None:            print(f'An error occurred: {exc_value}')        # 在退出上下文時進行清理工作# 使用自定義的上下文管理器處理異常with MyContextManager() as manager:    # 在這個代碼塊中可能會出現異常    raise ValueError('Something went wrong')

pGv28資訊網——每日最新資訊28at.com

總結

上下文管理器作為 Python 中極為重要的概念之一,為資源管理和異常處理提供了一種優雅而可靠的解決方案。通過定義自己的上下文管理器,我們可以輕松地擴展其應用范圍,實現更多自定義的資源管理和清理邏輯。同時,上下文管理器的嵌套使用可以幫助我們更好地處理多個資源的管理,使得代碼的結構更加清晰和可維護。pGv28資訊網——每日最新資訊28at.com

通過本文的學習,讀者可以更深入地理解上下文管理器的原理和用法,為編寫更加健壯和可靠的 Python 代碼打下堅實的基礎。希望讀者能夠充分利用上下文管理器這一強大工具,提高自己的編程效率和代碼質量。pGv28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-41718-0.htmlPython上下文管理,你真的了解嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 數據加密難做?試試這個庫

下一篇: 八個大幅提升開發效率的VS Code插件

標簽:
  • 熱門焦點
  • 8月總票房已突破10億!《封神》第一:口碑已經成了

    8月5日消息,據燈塔專業版數據,截至8月5日9時35分,8月總票房(含預售)已突破10億。其中,《封神》以大比分的優勢領先。根據官方消息,目前該片總票房已經超過14.
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 花7萬退貨退款無門:誰在縱容淘寶珠寶商家造假?

    來源:極點商業作者:楊銘在淘寶購買珠寶玉石后,因為保證金不夠賠付,店鋪關閉,退貨退款難、維權無門的比比皆是。&ldquo;提供相關產品鑒定證書,支持全國復檢,可以30天無理由退換貨。&
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就&ldquo;胡錫進炒股是否知道認真報道&rdquo;展開討論。有
  • 三星推出Galaxy Tab S9系列平板電腦以及Galaxy Watch6系列智能手表

    2023年7月26日,三星電子正式發布了Galaxy Z Flip5與Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板電腦以及三星Galaxy Watch6系列智能手表也同期
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主&ldquo;七王&rdquo;在群里介紹一些刷單賺
Top