在面试中被问到:with原理?常见用法是什么?有哪些使用场景?由于事先没有刷面试题,当时那个懵,只回答了常用with来打开文件,事后回想,懊恼不已,由此有了这篇文章,用以记录。
1、with 打开文件
在没用到with时,打开文件(不考虑文件大小)代码如下:
try:
f = open(file, 'r') f.read()
finnaly:
f.close()
使用with代码:
with open(file, 'r') as f:
f.read()
如上代码可见,使用with时代码中不用关闭文件了,那文件关闭是怎么完成的呢?其实是__exit__()来完成的。
2、with 上下文管理器
with 后面必须是上下文管理器,上下文管理器我理解就是有__enter__()方法和__exit__()方法的类的实例化对象。
with 上下文管理器 as variable/tuple:
执行语句
执行顺序如下:
1、with后面代码执行,生成上下文管理器;
2、将__enter__()方法的返回值赋值给as后的变量或者元组(注意:不能是逗号隔开的多个变量);
3、不管执行语句代码是否有异常,都会执行__exit__()方法,例如释放资源等。如果出现异常,则 sys.exc_info()的type、value、traceback会当做参数传给__exit__(),然后程序结束;如果没有异常,则返回None给__exit__()。重点:如果出现异常,但__exit__()返回类似True,那么异常不会被抛出的。
3、常见用法
1、打开文件
2、数据库连接操作,将数据库出现异常的情况放在__exit__()中处理
3、控制线程锁的获取和释放
4、欢迎大家补充
版权归原作者 py_op_dev 所有, 如有侵权,请联系我们删除。