如何测试范围的等价性

6 投票
5 回答
736 浏览
提问于 2025-04-17 04:09

我有一个单元测试,它会检查在读取日志文件后,某个范围是否设置正确。我想直接测试一下 var == range(0,10)。但是在Python 3中, range(0,1) == range(0,1) 的结果是 False

有没有简单的方法可以在Python 3中测试两个范围是否相等呢?

5 个回答

1

试试 assertItemsEqual,这个可以在 文档里找到:

class MyTestCase(unittest.TestCase):
    def test_mytest(self):
        a = (0,1,2,3,4)
        self.assertItemsEqual(a, range(0,4))
6

第一个提到的解决方案是用“列表”把范围转换成列表,这样做效率不高。因为它会先把范围对象变成列表(如果范围很大,可能会占用很多内存),然后再比较每个元素。举个例子,假设有一个变量 a = range(1000000),这个“范围”对象本身很小,但如果把它转成列表,就会变得很大。然后你还得比较一百万个元素。

第二个答案效率更低,因为 assertItemsEqual 不仅会创建列表,还会对它们进行排序,然后再逐个比较元素。

其实,既然你知道这些对象是范围,只要它们的步长、起始值和结束值相等,它们就是相等的。比如:

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

10

在Python3中,range会返回一个叫做range的可迭代对象。两个range只有在完全相同的情况下才算相等,也就是说,它们的id值要一样。如果你想比较它们的内容是否相同,可以把range转换成一个list来检查:

list(range(0,1)) == list(range(0,1))

对于短的范围,这种方法很好用。但如果范围非常长,Charles G Waldman的解决方案会更好。

撰写回答