@tingyuge
2016-10-01T14:47:01.000000Z
字数 1304
阅读 1672
Python
with
做为一种上下文管理器
,在Python
中的作用可以简单的理解为是用来代替try...except...finally
的处理流程。
with
通过__enter__
方法初始化,然后在__exit__
中做善后以及处理异常。对于一些需要预先设置,事后要清理的一些任务,with
提供了一种非常方便的表达。在紧跟with
后面的语句被求值运算后,会调用运算返回对象的__enter__
方法,并将__enter__
的返回结果赋值给as
后面的变量。当with
后面的代码块全部被执行完之后,将调用返回对象的__exit__()
方法执行清理工作。
就像在文件操作中:
file = open("file.txt")
try:
data = file.read()
finally:
file.close()
在使用了with...as...
后,代码将精简为:
with open("file.txt") as file:
data = file.read()
在上面的代码中,open()
函数会返回一个类型为file
的对象,该对象具有__enter__
与__exit__
方法(可以通过dir(file),type(file)
查看),之后调用对象的__enter__
方法,将返回值赋值给file
变量,所以在使用with...as...
操作文件时不需要显示的关闭文件。
既然知道with...as...
中最重要的就是__enter
、__exit__
,那我们就可以来自定义一个上下文管理器。
__enter__
方法将在进入代码块前被调用。__exit__
将在离开代码块之后被调用(即使在代码块中遇到了异常)。
class WithDemo:
def __enter__(self):
print "in __enter__"
return "WithDemo"
def __exit__(self, type, value, trace):
print "in __exit__"
def get_demo_with():
return WithDemo()
with get_demo_with() as demo:
print "demo:", demo
执行结果为:
in __enter__
demo:WithDemo
in __exit__
在刚开始的时候就已经说,with..as..
可以用来代替try...except...finally...
的流程操作,上面都在说try...finally...
的情况,那异常呢?如果仔细点会发现__exit__()
的参数有三个,这三个参数便是为异常提供处理的参数。
class WithDemo:
def __enter__(self):
return self
def __exit__(self, type, value, trace):
print "type:", type
print "value:", value
print "trace:", trace
def create_trace(self):
return (1/10) + 10
with WithDemo() as demo:
demo.create_trace()
跑一下代码就能发现代码打印出了type, value, trace。