0

假设我们有以下函数:

def f(x):
    """
    Turns x into a set.

    >>> given_x = ['a', 'b', 'c', 'd', 'e', 'f']
    >>> f(given_x)
    {'a', 'b', 'c', 'd', 'e', 'f'}

    """

    return set(x)

运行 doctest 将(通常)导致如下所示:

Failure
**********************************************************************
File "/home/black/Dev/exp_2.py", line 6, in f
Failed example:
    f(given_x)
Expected:
    {'a', 'b', 'c', 'd', 'e', 'f'}
Got:
    {'d', 'e', 'f', 'c', 'a', 'b'}

显然,由于该功能按预期工作,因此不应该发生此故障,但由于结果无序而确实发生了。


我的实际函数的输出可能比这复杂得多。它可能是一个包含字典、集合、列表的字典。

我需要一个通用的解决方案(如果有的话)。仅仅sort()在给出的例子上并不能解决我的真实案例问题。

问题:
当涉及无序输出时,如何防止 doctest(错误地)失败?

4

2 回答 2

4

为什么不将预期输出向上移动,以便测试相等性,预期输出为“True”?

def f(x):
    """
    Turns x into a set. 

    >>> given_x = ['a', 'b', 'c', 'd', 'e', 'f']
    >>> f(given_x) == {'a', 'b', 'c', 'd', 'e', 'f'}
    True
    """

    return set(x)

输出:

Trying:
    given_x = ['a', 'b', 'c', 'd', 'e', 'f']
Expecting nothing
ok
Trying:
    f(given_x) == {'a', 'b', 'c', 'd', 'e', 'f'}
Expecting:
    True
ok
于 2015-09-16T11:47:50.497 回答
0

python 集合不保证顺序,因此您不能依赖它。

我会强迫你拥有一些你可以信任的东西:

>>> given_x = ['z','a', 'a', 'b', 'c', 'd', 'e', 'f']
>>> type(f(given_x))
<type 'dict'>
>>> sorted(list(f(given(x))) 
['a', 'b', 'c', 'd', 'e', 'f','z']

我测试它是否具有预期的类型,它实际上做了集合的“唯一性”,结果是我所期望的

于 2015-09-16T11:25:44.493 回答