Подтвердить что ты не робот

Как проверить равенство слов с пакетом-пакетом Python?

Я пишу доктрину для функции, которая выводит словарь. Учение выглядит как

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

Когда я запускаю его, он терпит неудачу с

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

Мое лучшее предположение о причине этого отказа заключается в том, что doctest не проверяет словарное равенство, а равенство __repr__. Этот пост указывает, что есть какой-то способ обмануть doctest для проверки равенства словаря. Как я могу это сделать?

4b9b3361

Ответ 1

Doctest не проверяет равенство __repr__, по сути, он просто проверяет, что вывод точно такой же. Вы должны убедиться, что все, что напечатано, будет одинаковым для одного и того же словаря. Вы можете сделать это с помощью этого однострочного интерфейса:

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

Хотя этот вариант решения может быть более чистым:

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

Ответ 2

Еще один хороший способ - использовать pprint (в стандартной библиотеке).

>>> import pprint
>>> pprint.pprint({"second": 1, "first": 0})
{'first': 0, 'second': 1}

В соответствии с его исходным кодом, он сортирует dicts для вас:

http://hg.python.org/cpython/file/2.7/Lib/pprint.py#l158

items = _sorted(object.items())

Ответ 3

В итоге я использовал это. Хакки, но он работает.

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

Ответ 4

превратить его в список через dict.items(), а затем отсортировать его...

>>> l = my_function().items()
>>> l.sort()
>>> l
[('a', 'dictionary'), ('this', 'is')]

Ответ 5

Вы можете создать экземпляр класса unittest.TestCase внутри своих доктрин и использовать его для сравнения словарей:

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'}

Примечание: этот подход лучше, чем просто проверка, являются ли словари равными, потому что он будет показывать разницу между двумя словарями.