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

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

 更新時間:2020年08月07日 11:17:14   作者:David Beazley  
這篇文章主要介紹了Python實現(xiàn)上下文管理器的方法,幫助大家更好的理解和學(xué)習(xí)Python,感興趣的朋友可以了解下

問題

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

解決方案

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

import time
from contextlib import contextmanager

@contextmanager
def timethis(label):
  start = time.time()
  try:
    yield
  finally:
    end = time.time()
    print('{}: {}'.format(label, end - start))

# Example use
with timethis('counting'):
  n = 10000000
  while n > 0:
    n -= 1

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

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

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

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

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

class 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 注解的函數(shù)而言還是稍顯乏味。

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

以上就是Python實現(xiàn)上下文管理器的方法的詳細(xì)內(nèi)容,更多關(guān)于Python實現(xiàn)上下文管理器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python正則表達(dá)式的應(yīng)用詳解

    Python正則表達(dá)式的應(yīng)用詳解

    這篇文章主要介紹了Python中正則表達(dá)式的詳細(xì)教程,正則表達(dá)式是Python學(xué)習(xí)進(jìn)階當(dāng)中的重要內(nèi)容,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • 使用tensorflow根據(jù)輸入更改tensor shape

    使用tensorflow根據(jù)輸入更改tensor shape

    這篇文章主要介紹了使用tensorflow根據(jù)輸入更改tensor shape,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python如何優(yōu)雅獲取本機(jī)IP方法

    Python如何優(yōu)雅獲取本機(jī)IP方法

    這篇文章主要介紹了Python如何優(yōu)雅獲取本機(jī)IP方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python函數(shù)map()和partial()的知識點總結(jié)

    python函數(shù)map()和partial()的知識點總結(jié)

    在本篇文章里小編給大家分享了關(guān)于python函數(shù)map()和partial()的知識點總結(jié),需要的朋友們可以參考下。
    2020-05-05
  • python中使用sys模板和logging模塊獲取行號和函數(shù)名的方法

    python中使用sys模板和logging模塊獲取行號和函數(shù)名的方法

    這篇文章主要介紹了python中使用sys模板和logging模塊獲取行號和函數(shù)名的方法,需要的朋友可以參考下
    2014-04-04
  • python框架flask入門之路由及簡單實現(xiàn)方法

    python框架flask入門之路由及簡單實現(xiàn)方法

    這篇文章主要介紹了python框架flask入門路由及路由簡單實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Python函數(shù)的迭代器與生成器的示例代碼

    Python函數(shù)的迭代器與生成器的示例代碼

    這篇文章主要介紹了Python函數(shù)的迭代器與生成器的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 使用python繪制溫度變化雷達(dá)圖

    使用python繪制溫度變化雷達(dá)圖

    這篇文章主要為大家介紹了使用python繪制溫度變化雷達(dá)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 利用Python的pandas數(shù)據(jù)處理包將寬表變成窄表

    利用Python的pandas數(shù)據(jù)處理包將寬表變成窄表

    這篇文章主要介紹了利用Python的pandas數(shù)據(jù)處理包將寬表變成窄表,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Python合并Excel中sheet表的示例代碼

    Python合并Excel中sheet表的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)將Excel中的五個表合成一個表,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11

最新評論

大理市| 哈巴河县| 玉龙| 深圳市| 桂平市| 武义县| 萍乡市| 营山县| 铜陵市| 乌恰县| 马公市| 铜梁县| 自贡市| 玉溪市| 怀集县| 平罗县| 新宁县| 昆山市| 离岛区| 大埔县| 宜君县| 师宗县| 呼和浩特市| 淮滨县| 昭苏县| 柳林县| 仁化县| 荔浦县| 安顺市| 丰原市| 达尔| 花莲县| 沙雅县| 新疆| 永平县| 新疆| 诸城市| 锦州市| 鄱阳县| 金溪县| 双辽市|