如何测试范围的等价性
我有一个单元测试,它会检查在读取日志文件后,某个范围是否设置正确。我想直接测试一下 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的解决方案会更好。