日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Python上下文管理器深入講解_python

作者:ZYM66 ? 更新時間: 2023-01-26 編程語言

引子

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

大家之前都知道,使用Python打開文件的時候最好要使用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

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

以下為一個示例

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)這兩個方法。

上下文管理器(Context Manager)

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

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

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

enter()

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

exit()

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

原文鏈接:https://blog.csdn.net/ZYM66/article/details/128384300

欄目分類
最近更新