首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试范围的等价性

如何测试范围的等价性
EN

Stack Overflow用户
提问于 2011-10-12 21:26:39
回答 4查看 360关注 0票数 6

我的单元测试之一是在读取日志文件后检查是否正确设置了范围,我只想测试var == range(0,10)。但是,在Python3中,range(0,1) == range(0,1)的计算结果为False

有没有一种简单的方法来测试Python3中范围的等价性?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-12 21:28:55

在Python3中,range返回类型为range的迭代器。当且仅当两个range相同(即共享相同的id)时,它们是相等的。要测试其内容的相等性,请将range转换为list

代码语言:javascript
复制
list(range(0,1)) == list(range(0,1))

这在短范围内工作得很好。对于非常长的距离,Charles G Waldman's solution更好。

票数 10
EN

Stack Overflow用户

发布于 2011-10-12 22:39:24

第一种建议的解决方案-使用"list“将范围转换为列表-是无效的,因为它首先将范围对象转换为列表(如果范围很大,可能会消耗大量内存),然后比较每个元素。例如,考虑a= range(1000000),"range“对象本身很小,但如果你强迫它成为一个列表,它就会变得很大。然后你必须比较一百万个元素。

答案(2)的效率更低,因为assertItemsEqual不仅会实例化列表,还会在进行元素级比较之前对列表进行排序。

相反,由于您知道对象是范围,因此当它们的步幅、起始值和结束值相等时,它们是相等的。例如。

ranges_equal = len(a)==len(b) and (len(a)==0 or a[0]==b[0] and a[-1]==b[-1])

票数 6
EN

Stack Overflow用户

发布于 2011-10-12 21:28:24

尝试assertItemsEqual,(在docs中):

代码语言:javascript
复制
class MyTestCase(unittest.TestCase):
    def test_mytest(self):
        a = (0,1,2,3,4)
        self.assertItemsEqual(a, range(0,4))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7740796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档