加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python unittest分支覆盖似乎错过了zip中执行的生成器

发布时间:2020-12-16 22:52:03 所属栏目:Python 来源:网络整理
导读:我不太明白Python的分支覆盖统计数据试图告诉我什么.给出表单的代码 def f(a,b): c = (i for i in a) d = (j for j in b) # Line of interest return dict(zip(c,d))print(f(['a','b'],[1,2])) 这是在单元测试期间导入的,Python的标准分支覆盖率告诉我,感兴

我不太明白Python的分支覆盖统计数据试图告诉我什么.给出表单的代码

def f(a,b):
    c = (i for i in a)
    d = (j for j in b)  # Line of interest
    return dict(zip(c,d))

print(f(['a','b'],[1,2]))

这是在单元测试期间导入的,Python的标准分支覆盖率告诉我,感兴趣的行#line仅被部分覆盖(在CLI输出中为n-> -n,在漂亮的html报告中为“n?exit[?]”) .

返回的dict清楚地打印出来,用空列表执行仍会产生未覆盖的行.

我是否误解了覆盖范围输出?这闻起来像臭虫吗?

Python 3.5.1,Coverage 4.0.3

最佳答案
我进一步调查了这一点,我不认为这是一个覆盖范围内的错误.当第一个生成器(c)终止时,zip()有效地不会从第二个生成器(d)中收集任何更多的值,因此即使实际提取了每个元素,分支覆盖也不会跟踪d作为运行完成.

如果你改为写:

def f(a,b):
    c = (i for i in a)
    d = tuple(j for j in b)  # Line of interest
    return dict(zip(c,2]))

正如人们所期望的那样,即使输出相同,第二台发电机也会完成并且覆盖范围很快.

我不认为这有一个简单的方法,即使你把生成器表达式写成包含相同for循环的生成器函数,你得到一个(稍微更清楚)错误,执行永远不会跳转到函数exit.

我认为这只是覆盖范围的限制和发电机的退出条件,因为它无法知道发电机是否应该退出,因此它标记了未覆盖的情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读