亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python實(shí)現(xiàn)上下文管理器的方法

瀏覽:6日期:2022-07-14 16:54:43

問(wèn)題

你想自己去實(shí)現(xiàn)一個(gè)新的上下文管理器,以便使用with語(yǔ)句。

解決方案

實(shí)現(xiàn)一個(gè)新的上下文管理器的最簡(jiǎn)單的方法就是使用 contexlib 模塊中的 @contextmanager 裝飾器。 下面是一個(gè)實(shí)現(xiàn)了代碼塊計(jì)時(shí)功能的上下文管理器例子:

import timefrom contextlib import contextmanager@contextmanagerdef timethis(label): start = time.time() try: yield finally: end = time.time() print(’{}: {}’.format(label, end - start))# Example usewith timethis(’counting’): n = 10000000 while n > 0: n -= 1

在函數(shù) timethis() 中,yield 之前的代碼會(huì)在上下文管理器中作為 __enter__() 方法執(zhí)行, 所有在 yield 之后的代碼會(huì)作為 __exit__() 方法執(zhí)行。 如果出現(xiàn)了異常,異常會(huì)在yield語(yǔ)句那里拋出。

下面是一個(gè)更加高級(jí)一點(diǎn)的上下文管理器,實(shí)現(xiàn)了列表對(duì)象上的某種事務(wù):

@contextmanagerdef list_transaction(orig_list): working = list(orig_list) yield working orig_list[:] = working

這段代碼的作用是任何對(duì)列表的修改只有當(dāng)所有代碼運(yùn)行完成并且不出現(xiàn)異常的情況下才會(huì)生效。 下面我們來(lái)演示一下:

>>> items = [1, 2, 3]>>> with list_transaction(items) as working:... working.append(4)... working.append(5)...>>> items[1, 2, 3, 4, 5]>>> with list_transaction(items) as working:... working.append(6)... working.append(7)... raise RuntimeError(’oops’)...Traceback (most recent call last): File '<stdin>', line 4, in <module>RuntimeError: oops>>> items[1, 2, 3, 4, 5]>>>

討論

通常情況下,如果要寫一個(gè)上下文管理器,你需要定義一個(gè)類,里面包含一個(gè) __enter__() 和一個(gè) __exit__() 方法,如下所示:

import timeclass timethis: def __init__(self, label): self.label = label def __enter__(self): self.start = time.time() def __exit__(self, exc_ty, exc_val, exc_tb): end = time.time() print(’{}: {}’.format(self.label, end - self.start))

盡管這個(gè)也不難寫,但是相比較寫一個(gè)簡(jiǎn)單的使用 @contextmanager 注解的函數(shù)而言還是稍顯乏味。

@contextmanager 應(yīng)該僅僅用來(lái)寫自包含的上下文管理函數(shù)。 如果你有一些對(duì)象(比如一個(gè)文件、網(wǎng)絡(luò)連接或鎖),需要支持 with 語(yǔ)句,那么你就需要單獨(dú)實(shí)現(xiàn) __enter__() 方法和 __exit__() 方法。

以上就是Python實(shí)現(xiàn)上下文管理器的方法的詳細(xì)內(nèi)容,更多關(guān)于Python實(shí)現(xiàn)上下文管理器的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 日本aaaa级毛片在线看 | 亚洲精品久久久久中文 | 日韩国产成人精品视频 | 最新国产精品自拍 | 久久国产精品歌舞团 | 国产成人精视频在线观看免费 | 国产一区在线观看免费 | 国产乱码精品一区二区三上 | 中文字幕日韩国产 | 美女三级黄 | 久久国产乱子伦精品免费不卡 | 国产精品九九视频 | 日本久久99| 男女男精品视频 | 全部免费的毛片在线看美国 | 欧美成人中文字幕 | 久久一本精品久久精品66 | 曰本毛片va看到爽不卡 | 精品成人久久 | 欧美精品在线视频观看 | 欧美aaaaaaaaa | 俄罗斯一级毛片免费播放 | 久久久久久综合对白国产 | 国产毛片网站 | 男女扒开双腿猛进入免费网站 | 伊人狠狠丁香婷婷综合色 | 国内精品一区二区2021在线 | 久久久久久88色愉愉 | 特级深夜a级毛片免费观看 特级生活片 | 国产精品亚洲一区二区三区在线观看 | 干综合网 | 国产在线拍揄自揄视精品不卡 | 欧美日本在线一区二区三区 | 亚洲福利精品一区二区三区 | 中文字幕国产一区 | 国内自拍偷拍视频 | 国产一级视频免费 | 亚洲欧美日本国产综合在线 | 91精品久久| 久久一| ririai99在线视频观看 |