我正试图为一个在集合上调用random.sample()
的函数写一个doctest。不幸的是,似乎播种不足以保证输出。
考虑以下内容:
>>> 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的实现的。对于如何为这个场景编写doctest有什么想法吗?
提前感谢您的帮助
这是因为random.sample(s, 1)
在内部调用list(s)
,从而以不确定的顺序将集合扁平化为列表。这发生在尝试使用random.random()
函数之前。写doctest的问题和写doctest检查集合的问题是一样的:你不能,所以你需要像检查sorted(s)
这样的变通方法。
random.sample(sorted(s), 1)
来解决它。如果代码更复杂,并且在生产中添加sorted()
没有意义,我只能说祝你好运…