如何测试范围的等价性

one*_*ter 6 python unit-testing python-3.x

我的一个单元测试检查在读取日志文件后是否正确设置了一个范围,我想测试一下var == range(0,10).但是,range(0,1) == range(0,1)False在Python 3中进行评估.

有没有一种直接的方法来测试Python 3中的范围等价?

unu*_*tbu 10

在Python3中,range返回一个可迭代的类型range.range当且仅当两个s相同时(即共享相同id),两个s是相等的.为了测试其内容的相等性,将其转换rangelist:

list(range(0,1)) == list(range(0,1))
Run Code Online (Sandbox Code Playgroud)

这适用于短距离.对于很长的范围,Charles G Waldman的解决方案更好.

  • @StevenRumbalski:因为`range`对象是迭代而不是迭代器,所以它们不能被"消耗".[你可以多次迭代它们.](http://ideone.com/RGvxv) (2认同)
  • @Sven Marnach.优秀.谢谢你的纠正. (2认同)

Cha*_*man 6

第一个提出的解决方案 - 使用"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])

  • 如果范围步骤,这将不起作用.例如,范围(1,20,2)和范围(1,20)是等价的. (3认同)