国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python_上下文管理器

這篇具有很好參考價(jià)值的文章主要介紹了Python_上下文管理器。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

上下文管理器類

多上下文管理器

contextmanager實(shí)現(xiàn)上下文管理器


上下文管理器(context manager)是 Python 編程中的重要概念,用于規(guī)定某個(gè)對象的使用范圍。一旦進(jìn)入或者離開該使用范圍,會有特殊操作被調(diào)用 (比如為對象分配或者釋放內(nèi)存)。它的語法形式是with...as...

為了確保一些系統(tǒng)資源得以正確釋放,我們經(jīng)常會用到 try ... excepte ... finally 語句。如:

try:
   f = open('somefile')
   for line in f:
       print(line)
except Exception as e:
   print(e)
finally:
    f.close()

上面的代碼模式,從用復(fù)用代碼的模式來講,并不夠好。于是 with 語句出現(xiàn)了,通過定義一個(gè)上下文管理器來封裝這個(gè)代碼塊:

with open('filename', 'r') as f:
   for line in f:
          print(line)

顯然,with 語句比 try 語句簡潔了許多。

上下文管理器類

由于 with 語句利用了上下文管理器,在深入理解 with 語句之前,我們先看看上下文管理器。我們要定義一個(gè)上下文管理器其實(shí)很簡單,只要一個(gè)類實(shí)現(xiàn)了__enter__(self)和__exit__(self, exc_type, exc_valye, traceback)我們就叫他上下文管理器

__enter__(self)?返回一個(gè)對象,可以是當(dāng)前類的實(shí)例,也可以是其他對象。

class SomeThing:
   def __enter__(self):
       return self        # 返回類實(shí)例

class LineLength:
   def __init__(self, filepath):
       self.__file = open(self.__filepath)

   def __enter__(self):
       return self.__file        # 返回其他對象

執(zhí)行過程

下面讓我們看看 with 語句具體是如何執(zhí)行的。

第一步:執(zhí)行上下文表達(dá)式以獲得上下文管理器對象。上下文表達(dá)式就是 with 和 as 之間的代碼。

第二步:加載上下文管理器對象的 __exit__()方法備用。

第三步:執(zhí)行上下文管理器對象的__enter__()方法。

第四步:將__enter__()方法返回值綁定到 as 后面的 變量中。

第五步:執(zhí)行 with 內(nèi)的代碼塊。

第六步:執(zhí)行上下文管理器的__exit__()方法。

如果在代碼塊中發(fā)生了異常,異常被傳入__exit__()中。如果沒有,__exit__()的三個(gè)參數(shù)會傳入 None, None, None。__exit__()需要明確地返回 True 或 False。并且不能在__exit__()中再次拋出被傳入的異常,這是解釋器的工作,解釋器會根據(jù)返回值來確定是否繼續(xù)向上層代碼傳遞異常。當(dāng)返回 True 時(shí),異常不會被向上拋出,代碼會從報(bào)異常的代碼處跳出上下文管理繼續(xù)執(zhí)行代碼,當(dāng)返回 False 時(shí)會向上拋出,阻斷代碼執(zhí)行。當(dāng)沒有異常發(fā)生傳入__exit__()時(shí),解釋器會忽略返回值。

import time


class File(object):
    def __init__(self, filename, mode):
        print("上下文管理執(zhí)行順序:\n1、執(zhí)行初始化方法")
        self.f = open(filename, mode)

    def __enter__(self):
        print("2、執(zhí)行__enter__()方法")
        return self     # "__enter__()方法的返回值綁定到 as 后面的 變量中

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        :param exc_type:如果拋出異常,返回異常類型,否則返回None
        :param exc_val:如果拋出異常,返回異常內(nèi)容,否則返回None
        :param exc_tb:如果拋出異常,返回異常位置,否則返回None
        :return:
        """
        print("4、執(zhí)行__exit__()方法")
        if exc_type:
            print(exc_type, "\n", exc_val, "\n", exc_tb)

        # 若代碼塊報(bào)錯(cuò)則立即執(zhí)行__exit__()方法中的代碼;若代碼塊沒報(bào)錯(cuò),執(zhí)行完代碼塊后執(zhí)行__exit__()方法中的代碼"
        self.f.close()
        time.sleep(1)
        # return True     # 當(dāng)返回 True 時(shí),異常不會被向上拋出,代碼會從報(bào)異常的代碼處跳出上下文管理繼續(xù)執(zhí)行代碼,
        return False    # 當(dāng)返回 False 時(shí)會在__exit__()方法執(zhí)行完后向上拋出,阻斷代碼執(zhí)行。

    def reads(self):
        return self.f.read()


with File("README.md", "rb") as f:
    print("3、執(zhí)行代碼塊代碼")
    # 代碼塊部分
    f.reads()
    # 代碼塊報(bào)錯(cuò),報(bào)錯(cuò)后的代碼不會被執(zhí)行
    print("若代碼塊報(bào)錯(cuò),“我”不被執(zhí)行;將r改為rb,代碼塊不報(bào)錯(cuò)“我”就執(zhí)行")
print("若代碼塊報(bào)錯(cuò),__exit__()方法中返回 Ture “我”才執(zhí)行;若代碼塊不報(bào)錯(cuò),“我”也執(zhí)行")

執(zhí)行結(jié)果:

Python_上下文管理器

把"rb"改為"r"后執(zhí)行結(jié)果:

?文章來源地址http://www.zghlxwxcb.cn/news/detail-511418.html

Python_上下文管理器

多上下文管理器

實(shí)際上,我們可以同時(shí)處理多個(gè)上下文管理器:

with A() as a, B() as b:
   suite

所以我們大可不必寫嵌套的 with 語句。

contextmanager實(shí)現(xiàn)上下文管理器

Python還提供了一個(gè)contextmanager的裝飾器,更進(jìn)一步簡化了上下文管理器的實(shí)現(xiàn)方法。通過yield將函數(shù)分割成兩部分,yield之前的部分相當(dāng)于在__enter__方法中執(zhí)行,yield之后的部分相當(dāng)于在__exit__方法中執(zhí)行,緊跟在yield之后的返回值給as之后的變量。

from contextlib import contextmanager


class File:
    def __init__(self, filename, mode):
        self.f = open(filename, mode)

    def reads(self):
        return self.f.read()

    def closed(self):
        self.f.close()


@contextmanager
def read_file():
    print(1)
    rf = File("README.md", "rb")
    yield rf
    print(3)
    rf.closed()


with read_file() as f:
    print(2)
    f.reads()

執(zhí)行結(jié)果:

Python_上下文管理器

?把"rb"改為"r"后執(zhí)行結(jié)果:

Python_上下文管理器

?注:當(dāng)報(bào)錯(cuò)后,沒有打印3,不清楚yield下面的代碼是否執(zhí)行。


-事必有法,然后有成-?最后祝大家早日達(dá)到測試的天花板!


Python_上下文管理器


?以下是我收集到的比較好的學(xué)習(xí)教程資源,雖然不是什么很值錢的東西,如果你剛好需要,可以評論區(qū),留言【777】直接拿走就好了

?

到了這里,關(guān)于Python_上下文管理器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python教程(27)——如何使用Python中的上下文管理器

    當(dāng)我們在編寫代碼時(shí),經(jīng)常會遇到需要管理資源的情況,比如打開和關(guān)閉文件,如果遇到了一些異常情況,我們需要關(guān)閉資源,不然會導(dǎo)致資源泄露,雖然我們可以通過手動的方式來關(guān)閉,但如果有多個(gè)異常情況需要考慮的話,萬一不小心漏了一處,就芭比Q了。所以,如果有

    2024年02月19日
    瀏覽(23)
  • docker的上下文和工作目錄

    在編寫Dockerfile時(shí)我們總會接觸到COPY上下文和工作目錄,有時(shí)候 這些位置 搞不清楚,總是讓我們陷入困境,本文就一起來看下 這2個(gè)路徑 。 Dockerfile文件的COPY指令,拷貝的源文件就是基于上下文目錄來查找的,到底什么是上下文路徑,我們需要先來看下,而要解釋清楚什么是

    2023年04月20日
    瀏覽(24)
  • 【 Python 全棧開發(fā) - WEB開發(fā)篇 - 38 】property和上下文管理器

    Python 是一個(gè)簡潔而強(qiáng)大的編程語言,通過提供各種特性和工具,使開發(fā)人員能夠更高效地進(jìn)行編程。其中一個(gè)非常有用的特性是 @property 裝飾器,它允許我們在類中定義屬性并自定義其行為。 @property 裝飾器用于將一個(gè)方法轉(zhuǎn)換為類的屬性。使用 @property 裝飾器,我們可以像訪

    2024年02月13日
    瀏覽(36)
  • 無限上下文,多級內(nèi)存管理!突破ChatGPT等大語言模型上下文限制

    無限上下文,多級內(nèi)存管理!突破ChatGPT等大語言模型上下文限制

    目前,ChatGPT、Llama 2、文心一言等主流大語言模型,因技術(shù)架構(gòu)的問題上下文輸入一直受到限制,即便是Claude 最多只支持10萬token輸入,這對于解讀上百頁報(bào)告、書籍、論文來說非常不方便。 為了解決這一難題,加州伯克利分校受操作系統(tǒng)的內(nèi)存管理機(jī)制啟發(fā),提出了MemGPT。

    2024年02月06日
    瀏覽(26)
  • 【python】flask執(zhí)行上下文context,請求上下文和應(yīng)用上下文原理解析

    【python】flask執(zhí)行上下文context,請求上下文和應(yīng)用上下文原理解析

    ?? 歡迎大家來到景天科技苑?? ???? 養(yǎng)成好習(xí)慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構(gòu)師,華為云開發(fā)者社區(qū)專家博主,阿里云開發(fā)者社區(qū)專家博主,CSDN新星創(chuàng)作者,掘金優(yōu)秀博主,51CTO博客專家等。 ??《博客》:Python全棧,前后端開

    2024年03月26日
    瀏覽(22)
  • Zustand 和 React 上下文狀態(tài)管理

    Zustand 和 React 上下文狀態(tài)管理

    Zustand 是客戶端全局狀態(tài)管理的一個(gè)很棒的庫。它簡單、快速,并且包大小小。然而,有一件事我不一定喜歡它:這些 Store 是全局性的。 但這不是全局狀態(tài)管理的重點(diǎn)嗎?要使該狀態(tài)在您的應(yīng)用程序中隨處可用。不過當(dāng)我回顧過去幾年中使用 zustand 的情況時(shí),我意識到,更多

    2024年04月25日
    瀏覽(22)
  • pymysql 上下文管理器控制事務(wù)提交和回滾

    示例: 從上面例子看出, 在with結(jié)構(gòu)進(jìn)入時(shí),事務(wù)開始begin 在with結(jié)構(gòu)退出時(shí),會根據(jù)是否產(chǎn)生異常進(jìn)行commit和rollback操作,并關(guān)閉連接

    2024年01月25日
    瀏覽(29)
  • (二十)Flask之上下文管理第一篇(粗糙縷一遍源碼)

    (二十)Flask之上下文管理第一篇(粗糙縷一遍源碼)

    ????作者介紹:【孤寒者】—CSDN全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、HDZ核心組成員、華為云享專家Python全棧領(lǐng)域博主、CSDN原力計(jì)劃作者 ???? 本文已收錄于Flask框架從入門到實(shí)戰(zhàn)專欄 :《Flask框架從入門到實(shí)戰(zhàn)》 ???? 熱門專欄推薦 :《Python全棧系列教程》、《Django框架從入門到實(shí)戰(zhàn)

    2024年01月19日
    瀏覽(22)
  • 超長上下文處理:基于Transformer上下文處理常見方法梳理

    超長上下文處理:基于Transformer上下文處理常見方法梳理

    原文鏈接:芝士AI吃魚 目前已經(jīng)采用多種方法來增加Transformer的上下文長度,主要側(cè)重于緩解注意力計(jì)算的二次復(fù)雜度。 例如,Transformer-XL通過緩存先前的上下文,并允許隨著層數(shù)的增加線性擴(kuò)展上下文。Longformer采用了一種注意力機(jī)制,使得token稀疏地關(guān)注遠(yuǎn)距離的token,從而

    2024年02月13日
    瀏覽(24)
  • 從零開始理解Linux中斷架構(gòu)(7)--- Linux執(zhí)行上下文之中斷上下文

    從零開始理解Linux中斷架構(gòu)(7)--- Linux執(zhí)行上下文之中斷上下文

    ????????當(dāng)前運(yùn)行的loop是一條執(zhí)行流,中斷程序運(yùn)行開啟了另外一條執(zhí)行流,從上一節(jié)得知這是三種跳轉(zhuǎn)的第三類,這個(gè)是一個(gè)大跳轉(zhuǎn)。對中斷程序的基本要求就是 中斷執(zhí)行完畢后要恢復(fù)到原來執(zhí)行的程序 ,除了時(shí)間流逝外,原來運(yùn)行的程序應(yīng)該毫無感知。 ???????

    2024年02月11日
    瀏覽(40)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包