对于系统资源的操作,如:文件操作、数据库操作等,我们往往打开文件、连接数据库后忘了将其close掉,这时就可能会引发异常,因此我们常用的做法是:

# coding:utf-8

f = open("a.txt", "w+")
try:
f.write("python")
except IOError:
print("IO ERR")
finally:
f.close()

这段代码的确能解决实际问题,但是看起来有些繁琐冗余,因此Python引入了内置的with模块来简单优雅地解决此类问题。

with open("a.txt", "w+") as f:
f.write("with python")
当执行到with代码块外的时候,系统会自动调用__exit__()方法,with替代了上述代码中的try-finally的功能,其原理是用到了上下文管理器。
所谓的上下文管理器就是实现了 __enter__() 和 __exit__() 方法的对象:
class ContextWith(object):
def __enter__(self):
print("执行__enter__方法") def __exit__(self, exc_type, exc_val, exc_tb):
print("执行__exit__方法") def get_context():
return ContextWith() with get_context() as f:
print("执行with模块内") result:

执行__enter__方法
  执行with模块内
  执行__exit__方法


上面代码可以看出在执行with时会先调用__enter__方法,然后执行with模块内的,最后退出with模块时会调用__exit__方法,对于上下文管理器,

Python中主要是contextlib模块,它是通过Generator实现的:

contextlib模块主要有:

  • ContextDecorator:这是个基类,用于定义基于类的上下文管理器,同时也可以用@ContextDecorator作用于函数上。
  • contextmanager:运行上下文的对象,控制着运行上下文的功能,上下文管理器通常由 with 语句触发,也可以直接通过调用contextmanager方法来使用。
  • closing:创建上下文管理器,在执行过程离开with语句体时自动执行object.close(),一旦代码块运行完毕,它就会将事件关闭。
  • suppress:可以禁止任意数目的异常,如调用 suppress(FileNotFoundError)时,当文件不存在时不会抛出异常。
  • ExitStack:维护一个寄存器的栈,当退出with语句时,文件就会关闭,栈会按照相反的顺序调用这些上下文管理器。

Python的with上下文管理器类似于go语言的defer,可以起到简化finally,方便处理异常的作用。

Python上下文管理器 with的更多相关文章

  1. python 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...

  2. Python 上下文管理器和else块

    最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要.目前,我们只了解了上下文管理器的皮毛--Basic 语言有with 语句,而且很多语言都有.但是,在各种语言中 with 语句的 ...

  3. Python上下文管理器

    在Python中让自己创建的函数.类.对象支持with语句,就实现了上线文管理协议.我们经常使用with open(file, "a+") as f:这样的语句,无需手动调用f.c ...

  4. python上下文管理器ContextLib及with语句

    http://blog.csdn.net/pipisorry/article/details/50444736 with语句 with语句是从 Python 2.5 开始引入的一种与异常处理相关的功能 ...

  5. Python上下文管理器(Context managers)

    上下文管理器(Context managers) 上下文管理器允许你在有需要的时候,精确地分配和释放资源. 使用上下文管理器最广泛的案例就是with语句了.想象下你有两个需要结对执行的相关操作,然后还 ...

  6. python上下文管理器细读

    test 1 上下文管理器,将生成器转化为上下文管理器 import contextlib @contextlib.contextmanager def a(): print(1) yield pri ...

  7. 吃透Python上下文管理器

    什么是上下文管理器? 我们常见的with open操作文件,就是一个上下文管理器.如: with open(file, 'rb') as f: text = f.read() 那上下文管理器具体的定义 ...

  8. python 上下文管理器contextlib.ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  9. Python 上下文管理器模块--contextlib

    在 Python 处理文件的时候我们使用 with 关键词来进行文件的资源关闭,但是并不是只有文件操作才能使用 with 语句.今天就让我们一起学习 Python 中的上下文管理 contextlib ...

随机推荐

  1. 关于如何实现Android透明状态栏的总结

    开门见山. 原来做的效果,如下图(顶部有一条明显的橙色状态栏):   a1.gif 改过之后(顶部状态栏是透明的):   p2.gif 我发现网上写的一些文章,不够简洁明了,我整理了一下,复制粘贴一下 ...

  2. JS跨域ajax访问

    方式1:jsonp解决跨域访问 需要服务和js配合 服务 [WebMethod] public void HelloWorld2(string name) { HttpContext.Current. ...

  3. 【转】Python学习路线

    Python最佳学习路线图 python语言基础 (1)Python3入门,数据类型,字符串 (2)判断/循环语句,函数,命名空间,作用域 (3)类与对象,继承,多态 (4)tkinter界面编程 ( ...

  4. iOS ibeacon 使用详解

    前段时间写项目,设计到了通过蓝牙ibeacon 的方式接收数据,最开始自己都之前都没听过什么叫ibeacon,然后就开始查资料,慢慢的也了解并知道了ibeacon怎么使用了.先大概解释下ibeacon ...

  5. Vuejs的一些总结

    http://blog.csdn.net/xllily_11/article/details/52312044 原文链接:http://mrzhang123.github.io/2016/07/14/ ...

  6. Executor多线程框架使用

    在我们的JDK1.5的时候JAVA推出一款为了更加方便开发的多线程应用而封装的框架(Executor),相比传统的Thread类,Executor更加的方便,性能好,更易于管理,而且支持线程池.一般在 ...

  7. vi 编辑器常用快捷键

    vi 编辑器 vim 编辑器算是vi的进阶版本 所有的unix like 系统都会内建vi编辑器 vi三种模式分别为: 1.一般模式(默认模式或指令模式) 上下左右方向键 移动光标 pageUp pa ...

  8. 剑指offer 二叉树中和为某一个值的路径

    剑指offer 牛客网 二叉树中和为某一个值的路径 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 15:53:58 2 ...

  9. skipfish web Scrabble

    1.skipfish 网页扫描抓取 2.w3af web漏洞扫描

  10. 20165314 2017-2018-2《Java程序设计》课程总结

    20165314 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:C语言基础调查和java学习展望 预备作业3:Linux安 ...