2015-01-28 3 views
0

docs для assertEqual в Python unittest сказатьОграничения assertEqual

assertEqual(first, second, msg=None)

испытаний, что первая и вторая равны. Если значения не считаются равными, тест проваливается

Если бы мои входы, first & second глубокие вложенные объекты (например, ДИКТ из списка Dict и списка и т.д.), есть какие-либо ограничения на то, что не может быть по сравнению с вышеприведенным утверждением? До сих пор я знаю, что если на какой-то глубине есть список, его порядок должен совпадать с обеих сторон (потому что так я обычно сравнивал список).

В документах нет конкретных упоминаний о вложенных объектах, и я не мог найти четкого ответа на него.

+1

Мне кажется, что 'assertEqual (a, b)' будет иметь поведение, эквивалентное 'assert a == b'. оператор '==' работает с вложенными коллекциями, поэтому 'assertEqual' тоже должен. – Kevin

+0

Это в документах для оператора равенства? Я видел несколько gists на github для различных реализаций вложенных сравнений, поэтому задавался вопросом, где работает оператор равенства по умолчанию. – user4150760

ответ

1

assertEqual называет соответствующий type equality function (при его наличии). например assertEqual на списках фактически звонки assertListEqual. Если функция равенства типа не указана, assertEqualsimply uses the == operator для определения равенства.

Обратите внимание, что вы можете сделать и зарегистрировать свои собственные функции равенства по типу, если хотите.

Если вы хотите посмотреть фактическую реализацию, assertListEqual просто делегирует assertSequenceEqual, который ultimately uses != to compare items. Если подпункты вложены, они сравниваются, но python сравнивает эти элементы. Например, списки считаются равными, если:

Типы последовательностей также поддерживают сравнение. В частности, кортежи и списки сравниваются лексикографически, сравнивая соответствующие элементы. Это означает, что для сравнения равенства каждый элемент должен сравниваться с равными, и две последовательности должны быть одного типа и иметь одинаковую длину. (Подробную информацию см. В Сравнениях в справочной системе.)

См. Документы на python sequences.

+0

У оператора '==' есть ограничение на вложенные объекты? диктофон dicts/lists и т. д. и т. д. – user4150760

+0

@ user4150760 - для встроенных контейнеров (список, dict, кортеж, набор, ...) все работает практически так, как вы ожидаете. например для сравнения 2 списков списков вы проверяете первый список в каждом, чтобы увидеть, равны ли они, затем второй, затем третий, ... списки списков списков будут работать аналогично (это всего лишь еще один уровень рекурсии). – mgilson

Смежные вопросы