最新国产好看的视频,伊人天堂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())

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

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

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

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

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

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

如果要實現(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('關閉文件')
        self.f.close()


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

輸出結果

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

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

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

1)_enter_

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

2)_exit_

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

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

當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())

輸出結果

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

需要注意的是:

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

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

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

通過contextlib實現(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())

總結

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

相關文章

  • Python+Yolov5人臉口罩識別的詳細步驟

    Python+Yolov5人臉口罩識別的詳細步驟

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

    python3判斷IP地址的方法

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

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

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

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

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

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

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

    python中的字典及嵌套遍歷

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

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

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

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

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

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

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

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

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

最新評論

九龙坡区| 厦门市| 萝北县| 赫章县| 贺兰县| 同德县| 澄江县| 兰坪| 石柱| 八宿县| 大同县| 许昌市| 桃园县| 集贤县| 南岸区| 壶关县| 仙居县| 常熟市| 新安县| 玛沁县| 鞍山市| 威海市| 琼结县| 台南县| 阿瓦提县| 平原县| 肥城市| 诏安县| 扎兰屯市| 芮城县| 安泽县| 罗江县| 无棣县| 南投县| 平顶山市| 阜新市| 平谷区| 诸城市| 平山县| 吴川市| 奉贤区|