assertEqual терпит неудачу для объектов, которые побайтовы идентичны? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть unittest, который сравнивает два словаря из 1 элемента, как этот:

{SomeClass(): SomeOtherClass()}

Диктофоны выглядят совершенно невооруженным глазом, и типы клавиш и значений одинаковы. Тем не менее, тест не пройден.

Конечно, я пробовал всевозможные трюки, чтобы создать какой-то вывод между ними, но ни один из них не показал разницы между этими объектами или какими-либо из их вложенных атрибутов. Объекты довольно большие, поэтому единичный тест не поможет.

В качестве последней отчаянной попытки я попытался выбрать эти диктовки и затем провести различие в Unix, но это тоже не показало никакой разницы. Называйте меня наивным, но для меня это означало бы, что эти объекты являются байтами для байта, и тест должен пройти. Что здесь происходит?

1 Ответ

0 голосов
/ 30 апреля 2018

Одинаковые метки не подразумевают побайтные идентичные объекты, и байтовые идентичные объекты не обязательно равны.

Вы можете подумать, что легко сделать байт-байтовые идентичные объекты автоматически равными, но это сталкивается с множеством проблем. Например, рассмотрим следующее:

class Foo(object):
    __slots__ = ['x']

x = Foo()
y = Foo()
x.x = y.x = Foo()

Помимо метаданных GC, x и y, вероятно, идентичны побайтно. Должны ли x и y автоматически совпадать? x единственный, чей атрибут x указывает на себя; это кажется достаточно большой разницей, что они не должны автоматически равняться.

Это только одна из проблем при попытке сделать то, что вы хотите по умолчанию. Выяснилось, что наименее запутанным по умолчанию является ==, работающий по идентичности; если в игру не вступит переопределение __eq__, объекты будут равны только себе.

...