2014-03-25 26 views
0

我正在尝试为一个函数编写一个doctest,在一个集合上调用random.sample()。不幸的是,播种似乎不足以保证产量。如何在测试集上使用doctest random.sample()?

考虑以下几点:

>>> import random 
>>> random.seed(1) 
>>> s = set(('Ut', 'Duis', 'Lorem', 'Excepteur')) 
>>> for _ in range(5): print(random.sample(s,1)) 
... 
['Duis'] 
['Ut'] 
['Excepteur'] 
['Ut'] 
['Lorem'] 
>>> random.seed(1) 
>>> for _ in range(5): print(random.sample(s,1)) 
... 
['Duis'] 
['Ut'] 
['Excepteur'] 
['Ut'] 
['Lorem'] 

但是,如果我重新实例Python解释:

>>> import random 
>>> random.seed(1) 
>>> s = set(('Ut', 'Duis', 'Lorem', 'Excepteur')) 
>>> for _ in range(5): print(random.sample(s,1)) 
... 
['Duis'] 
['Lorem'] 
['Ut'] 
['Lorem'] 
['Excepteur'] 

也就是说,具有相同的价值播种random不保证在Python的情况下相同的输出。我期望这个问题是特定于在Python中执行set的。任何有关如何为此场景编写文档测试的想法?

非常感谢您的帮助。

+0

什么是Python版本? – user2357112

+0

我使用Python 3.4-抱歉没有指定。 – Arman

回答

1

发生这种情况是因为random.sample(s, 1)在内部调用list(s),因此将该集合以非确定性顺序展平为列表。这发生在尝试使用random.random()函数之前。编写doctest的问题与编写doctest来检查一个集合相同:你不能,所以你需要检查sorted(s)等解决方法。

在最简单的情况下,您可以致电random.sample(sorted(s), 1)解决。如果代码更多地涉及到,并且在生产中添加sorted()没有任何意义,我只能说是好运...

+0

“写一个doctest来检查一个集合:你不能”为什么?他们测试平等。 – endolith

+0

我正在讨论具体的doctests,这是一个测试框架,它不是检查对象是否相等,而是它们的* repr *如预期的那样。 –

相关问题