我正在为刚接触Python的用户编写一组测试用例。我在测试中注意到的一个问题是它可能会产生误报。他们可能很幸运,碰巧按正确的顺序给出了每个元素,但他们确实应该使用一个有序的结构。
到目前为止,这是我能提出的最佳解决方案。
self.assertTrue(isinstance(result, Sequence) or
isinstance(result, GeneratorType) or
callable(getattr(result, '__reversed__', False)))
但是,我并不确信GeneratorType
是真的有序,或者这个测试是全面的。我觉得应该有更好的方法来测试这个。如何测试结构是否有订单?
答案 0 :(得分:3)
我认为,这是非常有趣的猜测。 在纯python中没有办法(没有实用程序代码) 检查是否订购了收集品。
让我们顺序去=)
要检查Sequence
或GeneratorType
您可以使用collections.Iterable
类型。
>>>
>>> import collections
>>>
>>> result = [1,2,3,4,-1]
>>> isinstance(result, collections.Iterable)
True
>>>
>>> def generator_func(arg=10):
... for i in xrange(arg):
... yield i
...
>>>
>>> generator_func()
<generator object generator_func at 0x7f667c50f190>
>>>
>>> result = generator_func()
>>> isinstance(result, collections.Iterable)
True
可是:
>>>
>>> result = {1,2,3,4,-1}
>>> isinstance(result, collections.Iterable)
True
>>>
对你来说这是不好的。 这是因为:
>>> x = {1,2,3,-1}
>>> x
set([1, 2, 3, -1])
>>> [_ for _ in x]
[1, 2, 3, -1]
>>> x = {1,2,3,0}
>>> x
set([0, 1, 2, 3])
>>> [_ for _ in x]
[0, 1, 2, 3]
>>> import collections
>>> isinstance(x, collections.Iterable)
True
>>>
当然,对于这种情况,你应该使用集合。仅限序列。
>>> result = {1,2,3,4,-1}
>>> isinstance(result, collections.Sequence)
False
>>> isinstance({1:2, 3:3}, collections.Sequence)
False
>>>
可是:
>>> result = generator_func()
>>> isinstance(result, collections.Sequence)
False
>>>
因此,我认为检查Sequence or GeneratorType
的想法很好。
检查此链接:
所以:
>>> result = generator_func()
>>> isinstance(result, (collections.Sequence, collections.Iterator))
True
>>> result = [1,2,3,4,5]
>>> isinstance(result, (collections.Sequence, collections.Iterator))
True
>>> result = (1,2,3,4,5)
>>> isinstance(result, (collections.Sequence, collections.Iterator))
True
>>> result = {1,2,3,4,5}
>>> isinstance(result, (collections.Sequence, collections.Iterator))
False
>>> result = {1:1,2:2,3:3,4:4,5:5}
>>> isinstance(result, (collections.Sequence, collections.Iterator))
False
>>>
А关于订单。
如果您不确定物品的顺序, 我认为你应该明确检查它们。
«明确比隐含更好。»
>>>
>>> def order_check(result, order_rule = cmp_rule):
... for item, next_item in zip(result, result[1:]):
... if not order_rule(item, next_item):
... return False
... return True
...
>>> def cmp_rule(item, next_item):
... if item < next_item:
... return True
... return False
...
>>>
>>> result = [1,2,3,4,5]
>>> order_check(result)
True
>>> result = [1,2,3,4,5,-1]
>>> order_check(result)
False
>>>
但老实说,发电机保证 订单与您在其中生成的订单相同。
答案 1 :(得分:-2)
您还没有完全描述您拥有&#34; order&#34 ;;你的&#34;可赎回&#34;是个好主意。我建议你仔细阅读&#34; dunder&#34; (双下划线)方法,以查看它们中的一个是否与您想要的定义匹配。根据你给我们的内容,我强烈怀疑__getitem__
是你想要的。还有'请求宽恕&#34;在结构上设置try-except块的方法:
try:
dummy = (_ for _ in result)
has_order = True
except:
has_order = False
return has_order