单行 if 语句的覆盖率
Coverage for one-liner if statement
Python 的静态代码分析器在以下情况下不生成分支(单行 if)。这是设计使然吗?即使只测试了一个案例,coverage
也能提供 100% 的覆盖率。
x = 1 if q == 0 else 10
任何人都可以解释一下吗?
第一条评论说"does not create a control structure."我不知道那是什么意思。不管是一行还是多行,编译后的字节码都差不多:
>>> 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 发生了什么的跟踪函数。为执行的每一行调用跟踪函数。 trace 函数不获取一行内的事件。
这里有更全面的改进方法的讨论:https://github.com/nedbat/coveragepy/issues/509
Python 的静态代码分析器在以下情况下不生成分支(单行 if)。这是设计使然吗?即使只测试了一个案例,coverage
也能提供 100% 的覆盖率。
x = 1 if q == 0 else 10
任何人都可以解释一下吗?
第一条评论说"does not create a control structure."我不知道那是什么意思。不管是一行还是多行,编译后的字节码都差不多:
>>> 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 发生了什么的跟踪函数。为执行的每一行调用跟踪函数。 trace 函数不获取一行内的事件。
这里有更全面的改进方法的讨论:https://github.com/nedbat/coveragepy/issues/509