Как проверить равенство слов с пакетом-пакетом Python?
Я пишу доктрину для функции, которая выводит словарь. Учение выглядит как
>>> my_function()
{'this': 'is', 'a': 'dictionary'}
Когда я запускаю его, он терпит неудачу с
Expected:
{'this': 'is', 'a': 'dictionary'}
Got:
{'a': 'dictionary', 'this': 'is'}
Мое лучшее предположение о причине этого отказа заключается в том, что doctest не проверяет словарное равенство, а равенство __repr__
. Этот пост указывает, что есть какой-то способ обмануть doctest для проверки равенства словаря. Как я могу это сделать?
Ответы
Ответ 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'}
Примечание: этот подход лучше, чем просто проверка, являются ли словари равными, потому что он будет показывать разницу между двумя словарями.
Ответ 6
Большая часть из них уже говорилась здесь. В любом случае JSYK: в документации доктрины есть выделенный раздел:
https://docs.python.org/3.5/library/doctest.html#warnings