Doctest python – игнорировать порядок списков

Есть ли директива doctest, чтобы игнорировать порядок элементов при сопоставлении ожидаемого и возвращаемого списков.

В настоящее время это не удается:

Expected:
  ['foo', 'bar']
Got:
  ['bar', 'foo']

person Priyansh Agrawal    schedule 22.08.2019    source источник
comment
Может быть, вы хотите использовать set вместо list?   -  person wjandrea    schedule 22.08.2019
comment
list — это упорядоченная структура данных, поэтому ее игнорирование противоречит смыслу использования такой структуры данных с самого начала. Что такое тест?   -  person C.Nivs    schedule 22.08.2019


Ответы (2)


Doctest всегда соответствует строковому выводу. Если вы хотите игнорировать порядок элементов списка, рекомендуется использовать sorted.

Последний пример из этой выдержки из doctest:

doctest серьезно относится к требованию точных совпадений в ожидаемом выводе. Если хотя бы один символ не совпадает, тест считается неудачным. Возможно, это несколько раз вас удивит, поскольку вы точно узнаете, что Python делает и что не гарантирует в отношении вывода. Например, при печати набора Python не гарантирует, что элемент будет напечатан в каком-либо определенном порядке, поэтому тест типа

>>>
>>> foo()
{"Hermione", "Harry"}

уязвим! Один обходной путь - сделать

>>>
>>> foo() == {"Hermione", "Harry"}
True

вместо. Другой - сделать

>>>
>>> d = sorted(foo())
>>> d

['Гарри', 'Гермиона']

person Mario Boley    schedule 29.08.2020

Проблема решена.

Оказывается, я печатал список, поэтому doctest пытался сопоставить строки вместо списков.

FTR, doctest действительно соответствует спискам, игнорируя порядок элементов.

person Priyansh Agrawal    schedule 22.08.2019
comment
Привет @priyansh-agrawal, кажется, это неправильное решение. Doctest соответствует строковому выводу. См. мой ответ с примерами из документов doctest. - person Mario Boley; 30.08.2020