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

一文帶你搞懂Python上下文管理器

 更新時間:2022年06月23日 15:57:44   作者:曲鳥  
這篇文章主要為大家介紹了Python上下文管理器,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一、什么是上下文管理器

我們在處理文件的時候經(jīng)??吹较旅孢@樣的代碼,它即是上下文管理器:

with open('test.txt', encoding='utf-8') as f:
    print(f.readlines())

它的含義是打開當(dāng)前目錄下的test.txt文件并打印它里面的內(nèi)容,與下面的代碼效果是一樣的:

f = open('test.txt', encoding='utf-8')
print(f.readlines())
f.close()

對比兩種寫法能夠發(fā)現(xiàn),使用with自動執(zhí)行了f.close()(關(guān)閉文件)的這步操作,能夠少寫一點(diǎn)代碼。

那這樣的上下文管理器是怎么實(shí)現(xiàn)的,下面為你講解。

二、如何實(shí)現(xiàn)上下文管理器

1. 通過類實(shí)現(xiàn)

如果要實(shí)現(xiàn)上面open的上下文管理器功能,我們可以通過創(chuàng)建一個類,并添加__enter____exit__方法即可,如下面的代碼所示:

class DiyOpen(object):

    def __init__(self, filename, **kwargs):
        self.f = open(filename, **kwargs)

    def __enter__(self):
        return self.f

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('關(guān)閉文件')
        self.f.close()


with DiyOpen('test.txt', encoding='utf-8') as f:
    print(f.readlines())

輸出結(jié)果

['第一行\(zhòng)n', '第二行\(zhòng)n', '第三行']
關(guān)閉文件

可以看到在我們打印出文件內(nèi)容后,自動執(zhí)行了關(guān)閉文件的操作。

__enter____exit__的含義是什么,__exit__后面的exc_type, exc_val, exc_tb又是什么意思呢?

1)_enter_

__enter__相對來說好理解的多,當(dāng)出現(xiàn)with語句時,它就會被觸發(fā),有返回值時,會把返回值賦值給as聲明的變量,也就是我們上面的as f中的f。

2)_exit_

__exit__是在with執(zhí)行完成后自動執(zhí)行的,他后面的參數(shù)含義如下:

  • exc_type:異常類型
  • exc_val:異常原因e
  • xc_tb:堆棧追蹤信息

當(dāng)with中執(zhí)行的代碼報錯時,除了不繼續(xù)執(zhí)行with包含的代碼外,還會將報錯信息放入上面的三個參數(shù)中,例如下面的代碼:

class DiyOpen(object):

    def __init__(self, filename, **kwargs):
        self.f = open(filename, **kwargs)

    def __enter__(self):
        return self.f

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(exc_type)
        print(exc_val)
        print(exc_tb)
        self.f.close()


with DiyOpen('test.txt', encoding='utf-8') as f:
    print(f.no())

輸出結(jié)果

<class 'AttributeError'>
'_io.TextIOWrapper' object has no attribute 'no'
<traceback object at 0x000002A34B834900>

需要注意的是:

  • 我們可以手動指定__exit__的返回值為True讓它不報錯。
  • 沒有異常信息時,上面的三個參數(shù)值都會為None

2. 通過contextlib實(shí)現(xiàn)

Python內(nèi)置了contextlib這個模塊用于實(shí)現(xiàn)上下文管理器,它是通過生成器yield實(shí)現(xiàn)的,這個模塊讓我們不必再創(chuàng)建類和__enter__和__exit__了。

通過contextlib實(shí)現(xiàn)open功能的代碼如下:

from contextlib import contextmanager

@contextmanager
def diy_open(filename, **kwargs):
    f = open(filename, **kwargs)  # __init__
    try:
        yield f  # __enter__
    finally:  # __exit__
        f.close()

with diy_open('test.txt', encoding='utf-8') as f:
    print(f.readlines())

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Python+Yolov5人臉口罩識別的詳細(xì)步驟

    Python+Yolov5人臉口罩識別的詳細(xì)步驟

    人臉口罩佩戴檢測(識別)是當(dāng)前急需的應(yīng)用,而YOLOv5是目前流行的強(qiáng)悍的目標(biāo)檢測技術(shù),下面這篇文章主要給大家介紹了關(guān)于Python+Yolov5人臉口罩識別的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • python3判斷IP地址的方法

    python3判斷IP地址的方法

    這篇文章主要為大家詳細(xì)介紹了python3判斷IP地址的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Python 使用dict實(shí)現(xiàn)switch的操作

    Python 使用dict實(shí)現(xiàn)switch的操作

    這篇文章主要介紹了Python 使用dict實(shí)現(xiàn)switch的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python3使用SMTP發(fā)送帶附件郵件

    Python3使用SMTP發(fā)送帶附件郵件

    這篇文章主要為大家詳細(xì)介紹了Python3使用SMTP發(fā)送帶附件郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • python用WxPython庫實(shí)現(xiàn)無邊框窗體和透明窗體實(shí)現(xiàn)方法詳解

    python用WxPython庫實(shí)現(xiàn)無邊框窗體和透明窗體實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了python用WxPython庫實(shí)現(xiàn)無邊框窗體和透明窗體實(shí)現(xiàn)方法詳解,需要的朋友可以參考下
    2020-02-02
  • python中的字典及嵌套遍歷

    python中的字典及嵌套遍歷

    這篇文章主要介紹了python中的字典及嵌套遍歷,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • python如何拆分含有多種分隔符的字符串

    python如何拆分含有多種分隔符的字符串

    這篇文章主要為大家詳細(xì)介紹了python如何拆分含有多種分隔符的字符串,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python使用pydub實(shí)現(xiàn)M4A轉(zhuǎn)MP3轉(zhuǎn)換器

    Python使用pydub實(shí)現(xiàn)M4A轉(zhuǎn)MP3轉(zhuǎn)換器

    這篇文章主要介紹了如何使用?wxPython?創(chuàng)建一個圖形用戶界面(GUI)應(yīng)用程序,能夠?qū)?.m4a?文件轉(zhuǎn)換為?.mp3?文件,感興趣的可以了解下
    2024-11-11
  • Pycharm報錯Non-zero?exit?code?(2)的完美解決方案

    Pycharm報錯Non-zero?exit?code?(2)的完美解決方案

    最近在使用pycharm安裝或升級模塊時出現(xiàn)了錯誤,下面這篇文章主要給大家介紹了關(guān)于Pycharm報錯Non-zero?exit?code?(2)的完美解決方案,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 利用Python進(jìn)行數(shù)據(jù)可視化的實(shí)例代碼

    利用Python進(jìn)行數(shù)據(jù)可視化的實(shí)例代碼

    數(shù)據(jù)可視化和數(shù)據(jù)挖掘都是探索數(shù)據(jù)和分析數(shù)據(jù)的一種手段,下面這篇文章主要給大家介紹了關(guān)于如何利用Python進(jìn)行數(shù)據(jù)可視化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09

最新評論

玛多县| 清徐县| 策勒县| 定远县| 上虞市| 兴和县| 五家渠市| 巴彦县| 沈阳市| 福安市| 泰兴市| 昆山市| 通渭县| 梁河县| 霍邱县| 施秉县| 荣昌县| 汝南县| 临猗县| 蓝山县| 衡水市| 汕尾市| 游戏| 桂林市| 婺源县| 山西省| 监利县| 宜宾县| 陵川县| 开封市| 九寨沟县| 宾川县| 静安区| 淮阳县| 昌平区| 望城县| 车险| 进贤县| 龙陵县| 兴国县| 上饶县|