python - 单行 if 语句的覆盖范围
问题描述
Python 的静态代码分析器在以下情况下不会生成分支(单行 if)。这是设计使然吗?即使coverage
只测试一种情况,Even 也能提供 100% 的覆盖率。
x = 1 if q == 0 else 10
任何人都可以对此有所了解吗?
解决方案
第一条评论说“不创建控制结构”。我不知道那是什么意思。不管是一行还是多行,编译出来的字节码都差不多:
>>> import dis
>>> def one_line():
... x = 1 if q == 0 else 10
...
>>> dis.dis(one_line)
2 0 LOAD_GLOBAL 0 (q)
2 LOAD_CONST 1 (0)
4 COMPARE_OP 2 (==)
6 POP_JUMP_IF_FALSE 12
8 LOAD_CONST 2 (1)
10 JUMP_FORWARD 2 (to 14)
>> 12 LOAD_CONST 3 (10)
>> 14 STORE_FAST 0 (x)
16 LOAD_CONST 0 (None)
18 RETURN_VALUE
>>> def multi_line():
... if q == 0:
... x = 1
... else:
... x = 10
...
>>> dis.dis(multi_line)
2 0 LOAD_GLOBAL 0 (q)
2 LOAD_CONST 1 (0)
4 COMPARE_OP 2 (==)
6 POP_JUMP_IF_FALSE 14
3 8 LOAD_CONST 2 (1)
10 STORE_FAST 0 (x)
12 JUMP_FORWARD 4 (to 18)
5 >> 14 LOAD_CONST 3 (10)
16 STORE_FAST 0 (x)
>> 18 LOAD_CONST 0 (None)
20 RETURN_VALUE
>>>
coverage.py 无法告诉您单行案例的原因是因为 Python 使用跟踪函数来告诉 coverage.py 发生了什么。为执行的每一行调用跟踪函数。跟踪函数不会获取一行内的事件。
此处对改进此问题的可能方法进行了更全面的讨论:https ://github.com/nedbat/coveragepy/issues/509
推荐阅读
- r - 相应地使用用户输入更改闪亮的 GUI
- java - 我们可以在没有临时文件的情况下在 java 中创建文件/zipfile 作为 InputStream
- r - 我如何在情节上比较 Kolmogorov 和 Lilieforce 测试?
- c# - Internet 速度低时运行程序的问题 (SQL Server CE)
- neural-network - 如何使用神经网络求解 PDE?
- html - Primer 与 Bootstrap 兼容吗?
- python-3.x - 如何使用 Helm Kafka Chart 和 Python pod 发布大型(5 兆字节)消息
- oracle - unixODBC - 无法加载 easysoft libodbc.a(libodbc.so.1)
- javascript - 为什么我的 HTML 模板会附加到同一个 DIV 容器中?
- haskell - 没有 Cont Monad 的继续传递风格的评估