45

辞書を出力する関数の doctest を書いています。doctestは次のようになります

>>> my_function()
{'this': 'is', 'a': 'dictionary'}

実行すると、失敗します

Expected:
    {'this': 'is', 'a': 'dictionary'}
Got:
    {'a': 'dictionary', 'this': 'is'}

この失敗の原因についての私の推測では、doctest は辞書の等価性をチェックしているのではなく、__repr__等価性をチェックしているのです。この投稿は、doctest をだまして辞書の等価性をチェックさせる方法があることを示しています。これどうやってするの?

4

7 に答える 7

40

別の良い方法は、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())
于 2014-01-20T06:37:57.757 に答える
30

__repr__Doctest は等価性自体をチェックしません。出力が完全に同じであることをチェックするだけです。印刷されるものはすべて、同じ辞書に対して同じであることを確認する必要があります。このワンライナーでそれを行うことができます:

>>> sorted(my_function().items())
[('a', 'dictionary'), ('this', 'is')]

ソリューションのこのバリエーションはよりクリーンかもしれませんが:

>>> my_function() == {'this': 'is', 'a': 'dictionary'}
True
于 2013-03-21T14:04:09.800 に答える
15

結局これを使いました。ハッキーですが、動作します。

>>> p = my_function()
>>> {'this': 'is', 'a': 'dictionary'} == p
True
于 2013-03-21T14:01:32.817 に答える
3

dict.items() を介してリストに変換し、並べ替えます...

>>> l = my_function().items()
>>> l.sort()
>>> l
[('a', 'dictionary'), ('this', 'is')]
于 2013-03-21T13:58:35.163 に答える
1

unittest.TestCasedoctest 内にクラスのインスタンスを作成し、それを使用して辞書を比較できます。

def my_function(x):
    """
    >>> from unittest import TestCase
    >>> t = TestCase()

    >>> t.assertDictEqual(
    ...     my_function('a'),
    ...     {'this': 'is', 'a': 'dictionary'}
    ... )

    >>> t.assertDictEqual(
    ...     my_function('b'),
    ...     {'this': 'is', 'b': 'dictionary'}
    ... )

    """
    return {'this': 'is', x: 'dictionary'}

注: このアプローチは、2 つの辞書間の差分が表示されるため、単に辞書が等しいかどうかを確認するよりも優れています。

于 2016-08-10T01:46:29.083 に答える