欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入講解Python中的上下文管理器和with語句

 更新時(shí)間:2023年06月08日 08:29:44   作者:小小張說故事  
這篇文章主要為大家介紹了Python中的上下文管理器和with語句的深入講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

Python的上下文管理器是一種用于封裝進(jìn)入和退出代碼塊的邏輯的工具,通常通過with語句來使用。這個(gè)機(jī)制可以讓我們更簡單、更安全地處理資源和異常。本文將深入講解Python中的上下文管理器和with語句。

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

上下文管理器是Python中的一種對(duì)象,用于在代碼塊執(zhí)行前后定義一些設(shè)置或清理的操作。例如,當(dāng)打開文件、獲取鎖或建立數(shù)據(jù)庫連接等需要清理的操作時(shí),上下文管理器會(huì)十分有用。

上下文管理器必須定義兩個(gè)特殊方法,__enter____exit__,分別在with語句開始和結(jié)束時(shí)被調(diào)用。

class MyContextManager:
    def __enter__(self):
        print('Entering the block')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('Exiting the block')

二、with語句如何工作?

with語句是一種異常安全的資源管理語句,它可以與上下文管理器一起使用,以自動(dòng)處理資源的獲取和釋放。

當(dāng)with語句被執(zhí)行時(shí),會(huì)發(fā)生以下步驟:

  • __enter__方法被調(diào)用。
  • 如果__enter__方法返回了一個(gè)值,那么這個(gè)值會(huì)被賦給as關(guān)鍵字后的變量。
  • with語句中的代碼塊被執(zhí)行。
  • 不論代碼塊是否正常執(zhí)行完畢,__exit__方法總是會(huì)被調(diào)用。
  • 如果代碼塊中發(fā)生了異常,異常的類型、值和追蹤信息會(huì)被傳遞給__exit__方法。

三、自定義上下文管理器

我們可以自定義上下文管理器來滿足特定的需求。例如,我們可以創(chuàng)建一個(gè)上下文管理器來自動(dòng)計(jì)時(shí):

import time
class TimerContextManager:
    def __enter__(self):
        self.start_time = time.time()
    def __exit__(self, exc_type, exc_val, exc_tb):
        end_time = time.time()
        print(f'Time elapsed: {end_time - self.start_time} seconds')
with TimerContextManager():
    # 模擬耗時(shí)操作
    time.sleep(2)

這個(gè)上下文管理器會(huì)在進(jìn)入和退出代碼塊時(shí)分別記錄時(shí)間,然后計(jì)算出代碼塊的運(yùn)行時(shí)間。

四、contextlib模塊

Python的contextlib模塊提供了一些用于創(chuàng)建和處理上下文管理器的實(shí)用工具。例如,contextlib.contextmanager裝飾器可以將一個(gè)生成器函數(shù)轉(zhuǎn)換成一個(gè)上下文管理器:

from contextlib import contextmanager
@contextmanager
def managed_file(name):
    try:
        f = open(name, 'w')
        yield f
    finally:
        f.close()
with managed_file('hello.txt') as f:
    f.write('Hello, world!')
    f.write('Bye now!')

在這個(gè)例子中,managed_file函數(shù)負(fù)責(zé)打開文件并將其傳遞給with語句,with語句結(jié)束后,文件會(huì)自動(dòng)關(guān)閉。這就避免了忘記關(guān)閉文件的風(fēng)險(xiǎn),并使代碼更加簡潔。

五、在異步代碼中使用上下文管理器

從Python 3.7開始,異步上下文管理器被引入到Python中,以支持異步with語句。異步上下文管理器需要實(shí)現(xiàn)__aenter____aexit__方法。

class AsyncContextManager:
    async def __aenter__(self):
        print('Entering the block')
        return self
    async def __aexit__(self, exc_type, exc_val, exc_tb):
        print('Exiting the block')
async def main():
    async with AsyncContextManager():
        print('Inside the block')
import asyncio
asyncio.run(main())

這在處理諸如異步IO操作這樣的異步操作時(shí)非常有用。

六、結(jié)論

上下文管理器和with語句是Python中非常強(qiáng)大的工具,它們可以幫助我們以更簡潔、更安全的方式管理資源和異常。通過理解這些概念并將其應(yīng)用到你的代碼中,你可以編寫出更優(yōu)雅、更健壯的Python代碼。

以上就是深入講解Python中的上下文管理器和with語句的詳細(xì)內(nèi)容,更多關(guān)于Python上下文管理器with的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PyTorch中torch.nn.Linear實(shí)例詳解

    PyTorch中torch.nn.Linear實(shí)例詳解

    torch.nn是包含了構(gòu)筑神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)基本元素的包,在這個(gè)包中可以找到任意的神經(jīng)網(wǎng)絡(luò)層,下面這篇文章主要給大家介紹了關(guān)于PyTorch中torch.nn.Linear的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 利用python和百度地圖API實(shí)現(xiàn)數(shù)據(jù)地圖標(biāo)注的方法

    利用python和百度地圖API實(shí)現(xiàn)數(shù)據(jù)地圖標(biāo)注的方法

    這篇文章主要介紹了利用python和百度地圖API實(shí)現(xiàn)數(shù)據(jù)地圖標(biāo)注的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 淺析Python中全局變量和局部變量的使用

    淺析Python中全局變量和局部變量的使用

    一個(gè)變量的名稱除了可以代表不同的東西以外,也表示“哪里可以使用”這個(gè)變量,這篇文章將會(huì)介紹全局變量和局部變量的用法和差異,感興趣的可以了解下
    2021-06-06
  • 基于Python制作一個(gè)全自動(dòng)微信清粉小工具

    基于Python制作一個(gè)全自動(dòng)微信清粉小工具

    在當(dāng)今社交軟件中,微信是最常用的通訊工具之一,這篇文章主要為大家介紹了一個(gè)使用?Python?和?uiautomator2?庫編寫的微信清粉工具,希望對(duì)大家有所幫助
    2024-12-12
  • python函數(shù)局部變量、全局變量、遞歸知識(shí)點(diǎn)總結(jié)

    python函數(shù)局部變量、全局變量、遞歸知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理了關(guān)于python函數(shù)局部變量、全局變量、遞歸知識(shí)點(diǎn),有興趣的朋友們學(xué)習(xí)參考下。
    2019-11-11
  • Python實(shí)現(xiàn)簡單圖像縮放與旋轉(zhuǎn)

    Python實(shí)現(xiàn)簡單圖像縮放與旋轉(zhuǎn)

    大家好,本篇文章主要講的是Python實(shí)現(xiàn)簡單圖像縮放與旋轉(zhuǎn),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Python中aiohttp的簡單使用

    Python中aiohttp的簡單使用

    aiohttp是Python中一個(gè)強(qiáng)大的異步HTTP客戶端和服務(wù)器框架,它可以幫助開發(fā)者快速構(gòu)建高性能的Web應(yīng)用程序。本文將介紹aiohttp的基本概念、使用方法和常見應(yīng)用場(chǎng)景,幫助讀者更好地了解和使用這個(gè)優(yōu)秀的框架
    2023-03-03
  • Python3自動(dòng)安裝第三方庫,跟pip說再見

    Python3自動(dòng)安裝第三方庫,跟pip說再見

    很多朋友私信小編Python安裝第三方庫安裝技巧,在這就不一一回復(fù)大家了,今天小編給大家分享一篇教程關(guān)于Python自動(dòng)安裝第三方庫的小技巧,本文以安裝plotly為例給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧
    2021-10-10
  • 解析Python的縮進(jìn)規(guī)則的使用

    解析Python的縮進(jìn)規(guī)則的使用

    這篇文章主要介紹了解析Python的縮進(jìn)規(guī)則的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Python使用shelve模塊實(shí)現(xiàn)簡單數(shù)據(jù)存儲(chǔ)的方法

    Python使用shelve模塊實(shí)現(xiàn)簡單數(shù)據(jù)存儲(chǔ)的方法

    這篇文章主要介紹了Python使用shelve模塊實(shí)現(xiàn)簡單數(shù)據(jù)存儲(chǔ)的方法,涉及shelve模塊實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的技巧,需要的朋友可以參考下
    2015-05-05

最新評(píng)論