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

Python上下文管理器深入講解

 更新時(shí)間:2022年12月21日 16:59:13   作者:ZYM66  
Python有三大神器,一個(gè)是裝飾器,一個(gè)是迭代器、生成器,最后一個(gè)就是今天文章的主角 -- 「上下文管理器」。上下文管理器在日常開發(fā)中的作用是非常大的,可能有些人用到了也沒有意識到這一點(diǎn)

引子

上下文管理器是一種簡化代碼的有力方式,其內(nèi)部也蘊(yùn)含了很多Python的編程思想,今天我們就來探究一下Python的上下文管理器。

大家之前都知道,使用Python打開文件的時(shí)候最好要使用with語句,因?yàn)檫@樣就算在文件操作中出現(xiàn)了異常,也不會導(dǎo)致內(nèi)存泄露

代碼示例:

最簡單的文件打開方式(容易導(dǎo)致內(nèi)存泄露)

f = open("./xxx.txt")
f.close()

安全的文件打開方式,雖然相對復(fù)雜但是有效

# 打開文件
f = open('file.txt')
try:
    for line in f:
        # 讀取文件內(nèi)容 執(zhí)行其他操作
        # do_something...
finally:
    # 保證關(guān)閉文件
    f.close()

我們最經(jīng)常使用的文件打開方式

with open('file.txt', "r") as r:
	pass

如果一個(gè)對象要用with語句,那內(nèi)部要定義__enter__()方法和__exit__()方法。

以下為一個(gè)示例

class TestContext:
    def __init__(self, val):
        self.val = val
    def __enter__(self):
        print('進(jìn)入enter')
        return self.val
    def __exit__(self, exc_type, exc_value, exc_tb):
        print("進(jìn)入exit")
        print('exc_type: %s' % exc_type)
        print('exc_value: %s' % exc_value)
        print('exc_tb: %s' % exc_tb)
with TestContext(12) as t:
    print("進(jìn)入with內(nèi)部")
    raise ValueError
    print('t: %s' % t)

運(yùn)行后結(jié)果如下圖

不難看出,語句的調(diào)用順序

先進(jìn)入__enter__()中, 該方法的返回值賦值給上述代碼中with后邊的t。如果with下的語句出現(xiàn)了異常就會先執(zhí)行__exit__()語句中的內(nèi)容。如果沒有發(fā)生異常,就在執(zhí)行完畢with下方語句之后執(zhí)行__exit__()語句。

概念

上下文管理協(xié)議(Context Management Protocol)

包含方法 enter() 和 exit() ,支持該協(xié)議的對象要實(shí)現(xiàn)這兩個(gè)方法。

上下文管理器(Context Manager)

支持上下文管理協(xié)議的對象,這種對象必須實(shí)現(xiàn) enter() 和 exit() 方法。

上下文管理器定義執(zhí)行with語句時(shí)要建立的運(yùn)行時(shí)上下文,負(fù)責(zé)執(zhí)行with語句塊上下文中的進(jìn)入與退出操作。

通常使用with語句調(diào)用上下文管理器,也可以通過直接調(diào)用其方法來使用。

enter()

  • with語句執(zhí)行時(shí),先獲取上下文管理器對象,隨后調(diào)用其 enter()
  • 若有 as var 語句,則將返回值賦給變量var
  • 可以返回上下文管理器對象本身,也可以是其他相關(guān)對象

exit()

  • 帶有三個(gè)參數(shù) exc_type, exc_val, exc_tb
  • 若上下文管理器對象執(zhí)行無異常,則三個(gè)參數(shù)均為 None
  • 若發(fā)生異常,則三個(gè)參數(shù)分別為 異常類型,異常值和tracback信息

到此這篇關(guān)于Python上下文管理器深入講解的文章就介紹到這了,更多相關(guān)Python上下文管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python爬蟲之爬取我愛我家二手房數(shù)據(jù)

    Python爬蟲之爬取我愛我家二手房數(shù)據(jù)

    我愛我家的數(shù)據(jù)相對來說抓取難度不大,基本無反爬措施. 但若按照規(guī)則構(gòu)造頁面鏈接進(jìn)行抓取,會出現(xiàn)部分頁面無法獲取到數(shù)據(jù)的情況.在網(wǎng)上看了幾個(gè)博客,基本上都是較為簡單的獲取數(shù)據(jù),未解決這個(gè)問題,在實(shí)際應(yīng)用中會出錯(cuò),本文有非常詳細(xì)的代碼示例,需要的朋友可以參考下
    2021-05-05
  • Python之PyQt6對話框的實(shí)現(xiàn)

    Python之PyQt6對話框的實(shí)現(xiàn)

    這篇文章主要介紹了Python之PyQt6對話框的實(shí)現(xiàn),文章內(nèi)容詳細(xì),簡單易懂,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2023-01-01
  • jupyter notebook 重裝教程

    jupyter notebook 重裝教程

    這篇文章主要介紹了jupyter notebook 重裝教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python 中文亂碼問題深入分析

    python 中文亂碼問題深入分析

    一直以來,python中的中文編碼就是一個(gè)極為頭大的問題,經(jīng)常拋出編碼轉(zhuǎn)換的異常,python中的str和unicode到底是一個(gè)什么東西呢?
    2011-03-03
  • 詳解Django中Request對象的相關(guān)用法

    詳解Django中Request對象的相關(guān)用法

    這篇文章主要介紹了詳解Django中Request對象的相關(guān)用法,Django是Python重多人氣框架中最著名的一個(gè),需要的朋友可以參考下
    2015-07-07
  • 詳解如何利用pandas進(jìn)行數(shù)據(jù)行轉(zhuǎn)列和列轉(zhuǎn)行

    詳解如何利用pandas進(jìn)行數(shù)據(jù)行轉(zhuǎn)列和列轉(zhuǎn)行

    這篇文章主要為大家詳細(xì)介紹了如何利用pandas進(jìn)行數(shù)據(jù)行轉(zhuǎn)列和列轉(zhuǎn)行,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2007-02-02
  • Python如何在單元測試中給對象打補(bǔ)丁

    Python如何在單元測試中給對象打補(bǔ)丁

    這篇文章主要介紹了Python如何在單元測試中給對象打補(bǔ)丁,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • Python 常用 PEP8 編碼規(guī)范詳解

    Python 常用 PEP8 編碼規(guī)范詳解

    這篇文章主要介紹了Python 常用 PEP8 編碼規(guī)范詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Python3 queue隊(duì)列模塊詳細(xì)介紹

    Python3 queue隊(duì)列模塊詳細(xì)介紹

    queue是python中的標(biāo)準(zhǔn)庫,俗稱隊(duì)列。這篇文章給大家介紹了Python3 queue隊(duì)列模塊,包括模塊中的常用方法及構(gòu)造函數(shù),需要的朋友參考下吧
    2018-01-01
  • conda查看、創(chuàng)建、刪除、激活與退出環(huán)境命令詳解

    conda查看、創(chuàng)建、刪除、激活與退出環(huán)境命令詳解

    在不同的項(xiàng)目中經(jīng)常需要conda來配置環(huán)境,這樣能夠?qū)崿F(xiàn)不同版本的python和庫的隨意切換,并且減少了很多不必要的麻煩,下面這篇文章主要給大家介紹了關(guān)于conda查看、創(chuàng)建、刪除、激活與退出環(huán)境命令的相關(guān)資料,需要的朋友可以參考下
    2023-05-05

最新評論

杨浦区| 防城港市| 延吉市| 香港| 肃北| 佛教| 新竹市| 阳江市| 玉树县| 抚顺市| 米泉市| 蓝山县| 建平县| 合作市| 徐汇区| 浦江县| 沅江市| 乌兰浩特市| 夹江县| 清徐县| 枣阳市| 大渡口区| 阳曲县| 阜阳市| 招远市| 巍山| 崇文区| 英超| 南漳县| 老河口市| 吉隆县| 大兴区| 曲周县| 昔阳县| 织金县| 兴宁市| 双辽市| 花垣县| 新疆| 龙泉市| 同心县|