这是一个相对比较好理解的用法.
有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。
一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
with-as表达式极大的简化了每次写finally的工作.
在对文件操作时候用的最多, 可以写成以下非常简洁的方式. 重要的是, 你不需要去考虑什么时候fclose的问题.
with open("/tmp/foo.txt") as file: data = file.read()
需要注意的是, 代码优雅的背后一定是已经做了些什么. 从这个例子中, 表面上看不出来的任何玄机, 但是在open文件的时候, 已经完成了类似enter和finally的工作.
实际中着两个函数是__enter__ , __exit__ .
在实际的运行过程中,python会首先运行__enter__里的代码,返回self,作为as 后面的变量值,
然后再运行with模块中的代码,最后会自动执行exit中的代码,而不管with中的代码运行结果如何。
这也就是with能简化try-finally语句的原因。
所以with通常用在读取文件的操作中,将文件句柄的关闭操作放在exit方法中,这样就不会因忘记释放文件句柄而产生可能出现的错误。
另外,exit()方法的返回值可以用来指示with部分的代码出现的异常是否需要raise,如果返回false,则会raise,否则,不进行任何操作。
还有一个需要注意的地方, 就是 with ... as ... : 之后的函数, 是属于的外围对象的, 和紧跟with的函数没有必然的关系.
参考:
http://blog.kissdata.com/2014/05/23/python-with.html
http://effbot.org/zone/python-with-statement.htm
http://www.cnblogs.com/Brogrammer/archive/2012/07/23/2605570.html