python中的with的使用——一个非常好用的特性
一、try、except、finally使用
def exe_try():
try:
print("code started")
raise KeyError #抛出异常
return
except KeyError as e: #捕获异常
print("key error")
return 2
else:
print("other error")
return 3
finally: # 最后都会运行
print("finally")
return 4
if __name__ = "__main__":
result = exe_try()
print(result)
# code start
# key error
# finally
# 4
raise
了key error
,然后进入key error
的异常处理,按道理应该输出2的,为什么最后return
的是finally
中的4?
因为如果finally
语句有return
语句,那最后一定会输出4,可以想成是一种栈的形式,确实进入key error
后会返回2,但是2入栈后,finally
语句又会返回4,所以优先输出栈顶元素4。
如果注释掉finally
语句中的return
,那结果就是2了。
二、with语句
with上下文管理器协议:__enter__
、__exit__
两个魔法函数
class Sample:
def __enter__(self):
print("enter")
return self
def __exit__(self,exc_type,exc_value,exc_tb):
print("exit")
def do_something(self):
print("do somethong")
with Sample() as sample:
sample.do_something()
# enter
# doing something
# exit
从运行结果可以看出,先调用__enter__
,然后是do_something
,最后离开with
语句后会默认调用__exit__
。
有了这种上下文管理协议,我们就可以定义好一个类,然后用with
语句来使用,并且可以在__enter__
中获取资源,在__exit__
中释放资源。
三、小节
定义上下文管理器更加简洁的方式请看这篇博客