如何使用Python的doctest包测试字典相等性?
我正在为一个输出字典的函数写一个测试文档。这个测试文档看起来是这样的:
>>> my_function()
{'this': 'is', 'a': 'dictionary'}
当我运行它时,出现了失败,错误信息是:
Expected:
{'this': 'is', 'a': 'dictionary'}
Got:
{'a': 'dictionary', 'this': 'is'}
我猜测这个失败的原因可能是因为测试文档并不是在检查字典是否相等,而是在检查它的 __repr__
表示是否相等。这篇文章提到有一些方法可以让测试文档检查字典的相等性。我该怎么做呢?
8 个回答
16
我最后用了这个方法。虽然有点小技巧,但确实有效。
>>> p = my_function()
>>> {'this': 'is', 'a': 'dictionary'} == p
True
41
另一个不错的方法是使用 pprint
(这是标准库里的一个工具)。
>>> import pprint
>>> pprint.pprint({"second": 1, "first": 0})
{'first': 0, 'second': 1}
根据它的源代码,它会帮你对字典进行排序:
http://hg.python.org/cpython/file/2.7/Lib/pprint.py#l158
items = _sorted(object.items())
31
Doctest 并不会直接检查 __repr__
的相等性,它只是检查输出是否完全相同。你需要确保对于同一个字典,打印出来的内容是一样的。你可以用下面这行代码来做到这一点:
>>> sorted(my_function().items())
[('a', 'dictionary'), ('this', 'is')]
不过,你的解决方案的这个变体可能会更简洁一些:
>>> my_function() == {'this': 'is', 'a': 'dictionary'}
True