Сравните (утвердите равенство) две сложные структуры данных, содержащие пустые массивы в unittest
Я использую питонunittest
модуль и хотите проверить, равны ли две сложные структуры данных. Объектами могут быть списки dicts со всеми видами значений: числа, строки, контейнеры Python (списки / кортежи / dicts) иnumpy
массивы. Последние являются причиной для того, чтобы задать вопрос, потому что я не могу просто сделать
self.assertEqual(big_struct1, big_struct2)
потому что это производит
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()
Я полагаю, что мне нужно написать свой собственный тест на равенство для этого. Это должно работать для произвольных структур. Моя текущая идея - рекурсивная функция, которая:
пробует прямое сравнение токаузел" изarg1
в соответствующий узел;arg2
если исключение не возникает, переходит (Терминал" узлы / листья здесь тоже обрабатываются);еслиValueError
пойман, идет глубже, пока не находит;numpy.array
сравнивает массивы (например,как это).То, что кажется немного проблематичным, это отслеживание "соответствующий» узлы двух структур, но, возможно,zip
это все, что мне нужно здесь
Вопрос: есть ли хорошие (более простые) альтернативы этому подходу? Может бытьnumpy
представляет некоторые инструменты для этого? Если альтернативы не предложено, я реализую эту идею (если у меня нет лучшей) и опубликую в качестве ответа.
Постскриптум У меня есть смутное ощущение, что я мог видеть вопрос, касающийся этой проблемы, но я могуне могу найти это сейчас.
P.P.S. Альтернативным подходом будет функция, которая пересекает структуру и преобразует всеnumpy.array
с списками, но это легче реализовать? Кажется, то же самое для меня.
Редактировать: Наследованиеnumpy.ndarray
звучит очень многообещающе, но, очевидно, я необе стороны сравнения жестко запрограммированы в тесте. Однако один из них действительно закодирован, поэтому я могу:
numpy.array
менятьisinstance(other, SaneEqualityArray)
вisinstance(other, np.ndarray)
вjterrace»ответ s;всегда используйте это как LHS в сравнениях.Мои вопросы в этом отношении:
Будет ли это работать (я имею в виду, это звучит хорошо для меня, но, возможно, некоторые сложные случаи не будут обрабатываться правильно)? Будет ли мой пользовательский объект всегда заканчиваться LHS в рекурсивных проверках равенства, как я ожидаю?Опять же, есть ли лучшие способы (учитывая, что я получаю хотя бы одну из структур с реальнымnumpy
массивы).Редактировать 2: Я попробовал это, (на первый взгляд) рабочая реализация показана вэтот ответ