python的上下文管理器

上下文管理器可以用来包装任意格式的代码块,被用得最多地方就是,作为确保资源被正确清理的一种方式。

with open('/path/to/file', 'r') as f:
    f.read()

本质上讲,with语句是对其后面的代码进行求值,open表达式会返回一个对象,该对象包含两个方法,__enter____exit__

class Database(object):

    ...

    def __enter__(self):
        self.connect()
        return self

    def __exit__(self, exc_type, exc_instance, traceback):
        self.close()

__enter__方法只接受self参数,而__exit__方法还接受异常类型,异常实例和回溯选择(如果没有发生异常,则三个位置参数都是None)。

需要注意的是,只有__enter__的返回值会赋值给as后面的变量。
还有,__exit__方法只是向流程链上传播一场,这是通过返回False实现的,根本不需要与实例进行交互。

我们可以编写自己的上下文管理器。__enter__方法负责执行一些配置,__exit__方法则一般负责异常处理,资源清理等情况。

一般把上下文管理器视为try-except的替代品,而上下文管理器有价值的应用之一是必须在except子句中完成的工作很重要,且在应用程序中多处复用的情况。

  • contextlib
    可以用contextlib库简化构建上下文管理器的代码,例如:
from contextlib import contextmanager

@contextmanager
def tag(name):
    print("<%s>" % name)
    yield
    print("</%s>" % name)

with tag("h1"):
    print("hello")
    print("world")

tag里yield之前的就在with代码块之前发生,之后的同理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 上下文管理器的概念 上下文管理器的任务是代码块执行前准备,代码块执行后收拾。 如何使用上下文管理器? 如何使用上下...
    lintong阅读 4,266评论 0 4
  • contextlib — Context Manager Utilities contextlib - 上下文管理...
    英武阅读 7,905评论 0 52
  • 转载自:http://mp.weixin.qq.com/s/LO1yyFeUA6pR_YPyfDoSig 姓名:梅...
    虐先森阅读 5,254评论 0 1
  • 所谓上下文 计算机上下文(Context)对于我而言,一直是一个很抽象的名词。就像形而上一样,经常听见有人说,但是...
    人世间阅读 14,294评论 5 26
  • 子曰:巧言令色,鲜矣仁。 昨天说到,君子以仁立本,什么是仁呢,最关键的是孝弟。然后今天这则论语则是从反面阐述,什么...
    Evavaa阅读 2,900评论 0 0