Сравните (утвердите равенство) две сложные структуры данных, содержащие пустые массивы в 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: Я попробовал это, (на первый взгляд) рабочая реализация показана вэтот ответ

Ответы на вопрос(7)

Ваш ответ на вопрос