最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python編程ContextManager上下文管理器講解

 更新時間:2021年09月28日 17:24:40   作者:小菠蘿測試筆記  
這篇文章主要介紹了Python編程中對Context Manager上下文管理器的詳解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

什么是上下文管理器

官方解釋

上下文管理器是一個對象它定義了在執(zhí)行 with 語句時要建立的運行時上下文上下文管理器處理進入和退出所需的運行時上下文以執(zhí)行代碼塊上下文管理器通常使用 with 語句調(diào)用,但也可以通過直接調(diào)用它們的實例方法來使用

一頓花里胡哨猛如虎,結(jié)果我也不太懂

簡單一句話

同時包含 __enter__() 和 __exit__() 方法的對象就是上下文管理器

__enter__(self)

進入上下文管理器自動調(diào)用的方法

該方法會在 with ... as ... 代碼塊執(zhí)行之前執(zhí)行

如果 with 語句有 as 子句,且該方法有返回值,那么該方法的返回值會被賦值給 as 子句后的變量,最常見的 with open('file_path', 'w') as file: 

該方法可以返回多個值,因此在 as 子句后面也可以指定多個變量(多個變量必須由“()”括起來組成元組)

__exit__(self, exc_type, exc_value, exc_traceback)

退出上下文管理器自動調(diào)用的方法,會返回一個布爾類型的值

該方法會在 with ... as ... 代碼塊執(zhí)行之后執(zhí)行

如果 with ... as ... 代碼塊成功執(zhí)行結(jié)束,程序自動調(diào)用該方法,且三個參數(shù)都為 None

如果 with ... as ... 代碼塊執(zhí)行時發(fā)生異常,通過 sys.exc_info() 得到異常信息,三個參數(shù)值分別是:異常類型、異常信息、異?;厮菪畔㈩愋?/p>

有哪些常見上下文管理器?

打開文件

with open('file_path', 'w') as file:
    file.write('hello world !')

拆分了解

上下文表達(dá)式: with open('file_path', 'w') as file: 

上下文管理器: open('file_path', 'w') 

file:可以理解為資源對象

執(zhí)行順序

先執(zhí)行 open() 的 __enter__() 方法,將返回值賦值給 file

執(zhí)行 file.write('hello world !') 

最后執(zhí)行 open() 的 __exit__() 方法

自定義上下文管理器

其實有兩種方式

基于類實現(xiàn)上下文管理器

只需要給對象添加一個 __enter__ 和一個 __exit__ 方法

import sys
class Resource:
    def __init__(self, name):
        self.name = name
        print("== 初始化方法 ==")
 
    def __enter__(self):
        print(f"** 進入上下文管理器自動調(diào)用:name is {self.name}")
        # 可以返回任意類型的值
        return {"name": self.name}
 
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(f"## 退出上下文管理器自動調(diào)用:", sys.exc_info(), exc_type, exc_val, exc_tb)
        if exc_tb is None:
            print("沒有異常時關(guān)閉資源")
        else:
            print("遇到異常時關(guān)閉資源")

通過 with 來調(diào)用該上下文管理器

也稱為:使用 with ... as ... 管理資源

with Resource("小菠蘿") as r:
    print(r)

console 輸出結(jié)果

== 初始化方法 ==
** 進入上下文管理器自動調(diào)用:name is 小菠蘿
{'name': '小菠蘿'}
## 退出上下文管理器自動調(diào)用: (None, None, None) None None None
沒有異常時關(guān)閉資源

__exit__() 方法的三個參數(shù)值都是 None

with 代碼塊拋出異常

with Resource("異常小菠蘿") as r:
    print('[with代碼塊] 異常之前的代碼')
    raise Exception("拋出了 Exception")
    print('[with代碼塊] ~~~~~~~~異常之后的代碼')

console 輸出結(jié)果

== 初始化方法 ==
** 進入上下文管理器自動調(diào)用:name is 異常小菠蘿
[with代碼塊] 異常之前的代碼
## 退出上下文管理器自動調(diào)用: (<class 'Exception'>, Exception('拋出了 Exception'), <traceback object at 0x10e203200>) <class 'Exception'> 拋出了 Exception <traceback object at 0x10e203200>
遇到異常時關(guān)閉資源
Traceback (most recent call last):
  File "/Users/polo/Documents/pylearn/第七章:文件相關(guān)/1_上下文管理器.py", line 36, in <module>
    raise Exception("拋出了 Exception")
Exception: 拋出了 Exception

代碼塊拋出異常的時候,可以看到 __exit__() 方法的三個參數(shù)值的確來源于 sys.exc_info() 

總結(jié)

  •  無論 with 代碼塊是否有異常,最終都會自動調(diào)用 __exit__() 方法
  • 當(dāng)拋出異常時,__exit__() 默認(rèn)返回 None,會重新拋出異常到外面,讓 with ... as ... 以外的代碼來處理異常
  • 反之,如果返回 True,就會忽略異常,不再對異常進行處理

__exit__() 返回 True

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(f"## 退出上下文管理器自動調(diào)用:", sys.exc_info(), exc_type, exc_val, exc_tb)
        if exc_tb is None:
            print("沒有異常時關(guān)閉資源")
        else:
            print("遇到異常時關(guān)閉資源")
            return True
 
 
# 再次運行
with Resource("異常小菠蘿") as r:
    print('[with代碼塊] 拋出異常之前的代碼')
    raise Exception
    print('[with代碼塊] 拋出異常之后的代碼')

console 輸出結(jié)果

== 初始化方法 ==
** 進入上下文管理器自動調(diào)用:name is 異常小菠蘿
[with代碼塊] 異常之前的代碼
## 退出上下文管理器自動調(diào)用: (<class 'Exception'>, Exception('拋出了 Exception'), <traceback object at 0x100e29200>) <class 'Exception'> 拋出了 Exception <traceback object at 0x100e29200>
遇到異常時關(guān)閉資源

不再拋出異常

基于生成器實現(xiàn)上下文管理器

通過裝飾器 contextlib.contextmanager,來定義自己所需的基于生成器的上下文管理器

from contextlib import contextmanager 
@contextmanager
def file_manager(name, mode):
    try:
        # 1、打開文件
        file = open(name, mode)
        # 2、返回文件資源對象
        yield file
    finally:
        # 3、關(guān)閉文件
        file.close() 
with file_manager('a.txt', 'w') as file:
    print(file)
    file.write('hello world')

函數(shù) file_manager() 就是一個生成器

當(dāng)執(zhí)行 with as 語句時,獲取文件資源對象,生成器暫停執(zhí)行,返回文件資源對象并賦值給 file

當(dāng) with 語句執(zhí)行完后,生成器繼續(xù)執(zhí)行剩余代碼,關(guān)閉文件,釋放資源

總結(jié)

  • 基于生成器的上下文管理器時,不再用定義 __enter__() 和 __exit__() 方法
  • 但需要加上裝飾器 @contextmanager

 with 語句的教程

http://www.fzitv.net/article/172132.htm

以上就是Python編程ContextManager上下文管理器講解的詳細(xì)內(nèi)容,更多關(guān)于Python編程Context Manager的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python的詞法分析與語法分析

    Python的詞法分析與語法分析

    這篇文章主要介紹了Python的詞法分析(Lexical Analysis)與 語法分析(Syntactic Analysis),需要的朋友可以參考下
    2013-05-05
  • Python?PyQt拖動控件對齊到網(wǎng)格的方法步驟

    Python?PyQt拖動控件對齊到網(wǎng)格的方法步驟

    pyqt是一個用于創(chuàng)建GUI應(yīng)用程序的跨平臺工具包,它將python與qt庫融為一體,下面這篇文章主要給大家介紹了關(guān)于Python?PyQt拖動控件對齊到網(wǎng)格的方法步驟,需要的朋友可以參考下
    2022-12-12
  • python光學(xué)仿真學(xué)習(xí)wxpython創(chuàng)建手速測試程序

    python光學(xué)仿真學(xué)習(xí)wxpython創(chuàng)建手速測試程序

    這篇文章主要介紹了python光學(xué)仿真學(xué)習(xí)使用wxpython創(chuàng)建一個手速測試程序示例的實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 詳解Django緩存處理中Vary頭部的使用

    詳解Django緩存處理中Vary頭部的使用

    這篇文章主要介紹了詳解Django緩存處理中Vary頭部的使用,Django是最具人氣的Python web開發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • opencv實現(xiàn)答題卡識別

    opencv實現(xiàn)答題卡識別

    這篇文章主要為大家詳細(xì)介紹了opencv實現(xiàn)答題卡識別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python實現(xiàn)的檢測web服務(wù)器健康狀況的小程序

    Python實現(xiàn)的檢測web服務(wù)器健康狀況的小程序

    這篇文章主要介紹了Python實現(xiàn)的檢測web服務(wù)器健康狀況的小程序,本文使用socket庫來實現(xiàn),需要的朋友可以參考下
    2014-09-09
  • Python使用sqlalchemy模塊連接數(shù)據(jù)庫操作示例

    Python使用sqlalchemy模塊連接數(shù)據(jù)庫操作示例

    這篇文章主要介紹了Python使用sqlalchemy模塊連接數(shù)據(jù)庫操作,結(jié)合實例形式分析了sqlalchemy模塊的安裝及連接、調(diào)用數(shù)據(jù)庫相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Python 自動喚醒窗口截圖腳本

    Python 自動喚醒窗口截圖腳本

    截圖的操作用途最為廣泛,你可以用它配合定時工具,定時檢測某個程序的運行情況,本文給大家講下如何使用 win32api 實現(xiàn)自動喚醒并截圖的操作,對Python窗口截圖腳本知識感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Python OpenCV 基于圖像邊緣提取的輪廓發(fā)現(xiàn)函數(shù)

    Python OpenCV 基于圖像邊緣提取的輪廓發(fā)現(xiàn)函數(shù)

    這篇文章主要介紹了Python OpenCV 基于圖像邊緣提取的輪廓發(fā)現(xiàn)函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python析構(gòu)函數(shù)用法及注意事項

    python析構(gòu)函數(shù)用法及注意事項

    在本篇文章里小編給大家整理的是一篇關(guān)于python析構(gòu)函數(shù)用法及注意事項,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-06-06

最新評論

高碑店市| 上林县| 佛教| 柳州市| 搜索| 铜鼓县| 门源| 丰都县| 紫云| 东阳市| 商丘市| 临城县| 原平市| 安图县| 平定县| 和平区| 班戈县| 腾冲县| 高州市| 毕节市| 博罗县| 民乐县| 泽州县| 石渠县| 仙游县| 买车| 璧山县| 塔河县| 黄龙县| 泰和县| 香港| 新疆| 阜新市| 宕昌县| 桐梓县| 庄河市| 万盛区| 唐山市| 郑州市| 邮箱| 桐柏县|