色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

Python實現上下文管理器的方法

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

問題

你想自己去實現一個新的上下文管理器,以便使用with語句。

解決方案

實現一個新的上下文管理器的最簡單的方法就是使用 contexlib 模塊中的 @contextmanager 裝飾器。 下面是一個實現了代碼塊計時功能的上下文管理器例子:

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

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

下面是一個更加高級一點的上下文管理器,實現了列表對象上的某種事務:

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

這段代碼的作用是任何對列表的修改只有當所有代碼運行完成并且不出現異常的情況下才會生效。 下面我們來演示一下:

>>> 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]>>>

討論

通常情況下,如果要寫一個上下文管理器,你需要定義一個類,里面包含一個 __enter__() 和一個 __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))

盡管這個也不難寫,但是相比較寫一個簡單的使用 @contextmanager 注解的函數而言還是稍顯乏味。

@contextmanager 應該僅僅用來寫自包含的上下文管理函數。 如果你有一些對象(比如一個文件、網絡連接或鎖),需要支持 with 語句,那么你就需要單獨實現 __enter__() 方法和 __exit__() 方法。

以上就是Python實現上下文管理器的方法的詳細內容,更多關于Python實現上下文管理器的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 国产精品久久久99 | 最新国产精品好看的国产精品 | 看全色黄大色黄大片毛片 | 国产女人在线视频 | 黄色wwwxxx| 精品国产欧美一区二区最新 | 欧美一级毛片一级毛片 | 国产1000部成人免费视频 | 成人三级做爰在线观看男女 | 国产精品久久久久久久免费大片 | 亚洲欧美日韩精品久久久 | 精品9e精品视频在线观看 | 性盈盈影院在线观看 | 特级欧美午夜aa毛片 | 三级网站国产 | 久久99精品久久久久久秒播 | 国产盗摄一区二区三区 | 国产亚洲精品久久久久久久网站 | 免费乱码中文字幕网站 | 中文字幕 亚洲精品 第1页 | 综合视频在线 | 国产日产欧产精品精品推荐小说 | 日韩专区亚洲综合久久 | 精品中文字幕一区在线 | 99久久精品国产亚洲 | 欧美精品国产制服第一页 | 日韩欧美黄色 | jiz欧美高清 | 久久高清免费 | 狠狠色丁香久久婷婷综 | 久久视频在线视频 | 欧美顶级毛片在线播放小说 | 免费高清在线爱做视频 | 日本亚洲国产 | 精品欧美一区二区在线看片 | 97在线视频免费观看 | 香港三澳门三日本三级 | 亚洲三级免费观看 | 欧美亚洲国产人成aaa | 亚洲偷自拍另类图片二区 | 欧美成人久久久免费播放 |