Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何测试范围的等价性_Python_Unit Testing_Python 3.x - Fatal编程技术网

Python 如何测试范围的等价性

Python 如何测试范围的等价性,python,unit-testing,python-3.x,Python,Unit Testing,Python 3.x,我的一个单元测试在读取日志文件后检查范围设置是否正确,我只想测试var==range(0,10)。但是,在Python3中,range(0,1)=range(0,1)的计算结果为False 有没有一种简单的方法来测试Python 3中范围的等效性?试试assertItemsEqual,(在中): 在Python3中,range返回类型为range的iterable。两个范围相等,当且仅当它们相同时(即共享相同的id),要测试其内容是否相等,请将范围转换为列表: list(range(0,1))

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


有没有一种简单的方法来测试Python 3中范围的等效性?

试试
assertItemsEqual
,(在中):


在Python3中,
range
返回类型为
range
的iterable。两个
范围
相等,当且仅当它们相同时(即共享相同的
id
),要测试其内容是否相等,请将
范围
转换为
列表

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

这适用于短距离。对于很长的范围,最好是这样。

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

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

相反,因为您知道对象是范围,所以当它们的步长、起点和终点值相等时,它们是相等的。例如

范围_equal=len(a)==len(b)和(len(a)==0或a[0]==b[0]和a[-1]==b[-1])
另一种方法:

ranges\u equal=str(a)==str(b)

字符串表示法表示范围的开始、结束和步骤


这个问题让我想到,也许Python应该提供一种从range对象本身获取这些属性的方法

为什么要比较两个范围?我的unittest只是断言范围的构造是正确的。在程序中,我没有存储最小和最大可接受值,而是存储范围,然后测试val是否在范围内。@oneporter:请注意,这会消耗迭代器,以后您将无法重新消耗它。@StevenRumbalski:因为
range
对象是可重用的,而不是迭代器,所以不能“消耗”它们。如果范围变小,则此操作将不起作用。例如,范围(1,20,2)和范围(1,20)是相等的。好的点krs1。我认为我的方法可以通过比较范围的len()来修正。。。。范围等于(len(a)=len(b)和a[0]==b[0]和a[-1]==b[-1]),或者,如果避免空范围的问题:
范围等于len(a)==len(b)=0或len(a)=len len(b)和a[0]==b[0]和a[-1]==b[-1]
我不太确定
范围(0,0)
等于
范围(100100),即使两个范围都是空的。我想这取决于你对它们做了什么……嗯,对我来说,它们只是拼写“空”的不同方式。但如果这很重要,请注意,所有其他建议也无法区分这些情况。如果这很重要,您可以执行
ranges\u equal=str(a)==str(b)
请注意,assertItemsEqual在py3中不可用,这正是OP所要求的。
list(range(0,1)) == list(range(0,1))