with语句的作用
对于一个事先需要设置事后需要清理的任务,with可以很简洁的处理并且监控中间的异常。但是实际上它的功能完全可以用try-except-else-finally语句实现,但是with-as更加简洁,可以看做try语句的简化版。
非常常见的例子是文件的打开
同样的功能,如果用try语句
f = open("1.txt","w")
try:
data = f.read()
finally:
f.close()
如果用with语句
with open("1.txt","w") as f:
data = f.read()
可以看出来,with语句要简洁许多
深入理解with语句
其实实际上,所谓事前需要设置事后需要清理,指的是一个对象有 __enter__() 和 __exit__() 方法,只有拥有这样方法的对象才可以用with-as语句。
我们来定义一个符合要求的对象:
class test:
def __enter__(self):
print("enter!")
def __exit__(self, type, value, trace):
print("exit!")
if __name__ == "__main__":
with test() as t:
print('yes')
输出是
enter!
yes
exit!
待探究
为什么__enter__和__exit__方法的参数必须是1个和4个?
如果改变__exit__的参数数量则报错
TypeError: __exit__() takes 3 positional arguments but 4 were given
本文参考了https://www.cnblogs.com/DswCnblog/p/6126588.html