千家信息网

python如何使用ContextLib

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,小编给大家分享一下python如何使用ContextLib,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!上下文管理库(Co
千家信息网最后更新 2024年11月24日python如何使用ContextLib

小编给大家分享一下python如何使用ContextLib,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

上下文管理库(ContextLib)

contextlib模块包含了与上下文管理器和with声明相关的工具。通常如果你想写一个上下文管理器,则你需要定义一个类包含enter方法以及exit方法,例如:

import timeclass demo:  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))

完整的例子在此:

import timeclass demo:  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))with demo('counting'):  n = 10000000  while n > 0:    n -= 1# counting: 1.36000013351

上下文管理器被with声明所激活,这个API涉及到两个方法。 enter方法,当执行流进入with代码块时,enter方法将执行。并且它将返回一个可供上下文使用的对象。
当执行流离开with代码块时,exit方法被调用,它将清理被使用的资源。

利用@contextmanager装饰器改写上面那个例子:

from contextlib import contextmanagerimport time@contextmanagerdef demo(label):  start = time.time()  try:    yield  finally:    end = time.time()    print('{}: {}'.format(label, end - start))with demo('counting'):  n = 10000000  while n > 0:    n -= 1# counting: 1.32399988174

看上面这个例子,函数中yield之前的所有代码都类似于上下文管理器中enter方法的内容。而yield之后的所有代码都如exit方法的内容。如果执行过程中发生了异常,则会在yield语句触发。

以上是"python如何使用ContextLib"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0