with ...as ...

这是一个相对比较好理解的用法. 

有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,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

原文地址:https://www.cnblogs.com/qingyuanjushi/p/5985551.html