Python 中的 with 是测试常用到的资源打开利器
在我们完成自动化测试代码的时候,总会遇见各种读取文本文件、读取 Excel 等类型的操作。这种代码我们时刻都要记得打开文件后要关闭文件。往往关闭文件却是我们常常忘记的。针对上述这样的情况,python 提供了 with 就可以完美解决这个问题,这也是 python 的语法糖。
Syntactic sugar,也就是语法糖,它指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性。语法糖就是为了避免 coder 出现错误并提高效率的语法层面的一种优雅的解决方案。
一个常规的文件打开代码
下面是一个常规的打开文件的代码,那么你可以从下面代码中看出什么问题吗?
上面代码在读取文件过程中如果发生异常,那么 close()函数就没有办法被执行到了,这也就导致了文件没有办法关闭了。因此,很多教程上都告诉大家要用 try except 将文件读取的异常捕获到,那么我们改造一下如下:
好了,上面的代码无论如何我们都会执行 close 函数了,这样是不是已经很好了。但是上面的代码太繁琐了,这样的 coding 段,python 提供了 with,让上述的代码更简单:
上面是不是很简洁,是不是也很优雅呢。
with 是怎么干活的
上述代码片段中,`context_expression`会返回一个上下文管理器对象,这个对象并不赋值给`as`后的`target(s)`,而是上下文管理器的`__enter__()`函数的返回值赋值给 `target(s)`。当 with 全部的代码段都执行完成后,会调用`__exit__()`。
具体例子如下:
运行完后,输入如下:
那下面我来给你解释一下上面的代码段以及结果输出。
1、在 main 函数中我们使用 with 调用了 SampleWith(),这是时候我们就会看到了我们险实力话了一个 SampleWith 类,调用了他的`__init__(self)`构造函数,
2、接下来因为我们使用了 with 这个语法糖,因此下面调用了`__enter__(self)`
3、在后面我使用了`as sw`,也就是我将`__enter__(self)`的 return 赋值给了`sw`,那么也就是说`sw`存储的是字符串`CrissChan`,那么也就打印了`sw is : CrissChan`
4、后面调用了 sw.call()就出了问题,因为字符串没有 call 方法。但是仍旧进入了`__exit__(self, exc_type, exc_val, exc_tb)`函数。
下面我将上面有报错的代码修改一下,如下:
上面代码就不会报错了。从上面可以看出就算中间除了异常,放在`__exit__()`中的逻辑段还是会被执行的。想要了解更多请看官方的文档[pep-403](https://www.python.org/dev/peps/pep-0343/)
特别备注:
exit()方法中有3个参数, exc_type, exc_val, exc_tb,这些参数在异常处理中相当有用。
exc_type: 错误的类型
exc_val: 错误类型对应的值
exc_tb: 代码中错误发生的位置
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://blog.csdn.net/crisschan
版权声明: 本文为 InfoQ 作者【陈磊@Criss】的原创文章。
原文链接:【http://xie.infoq.cn/article/abd34b4622bd3d8d436250fd3】。未经作者许可,禁止转载。
评论