如何对用在集合上的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中集合实现的特性。有没有什么好的方法可以为这种情况写测试呢?
提前感谢你的帮助。
1 个回答
2
这个问题发生是因为 random.sample(s, 1)
在内部会调用 list(s)
,这样就把集合变成了一个列表,而且顺序是随机的。在调用 random.random()
函数之前就已经发生了这个变化。写测试的时候遇到的问题和检查一个集合的测试是一样的:你无法直接检查,所以需要一些变通的方法,比如检查 sorted(s)
。
在最简单的情况下,你可以通过调用 random.sample(sorted(s), 1)
来解决这个问题。如果代码比较复杂,直接在生产环境中加 sorted()
可能不太合适,那我只能祝你好运了……