Python pickle: засоленные объекты не равны исходным объектам - PullRequest
1 голос
/ 02 марта 2012

Я думаю, что это ожидаемое поведение, но хочу проверить и, возможно, выяснить, почему, поскольку проведенное мной исследование оказалось пустым

У меня есть функция, которая извлекает данные, создает новый экземпляр моего пользовательского интерфейса.класс, а затем добавляет его в список.Класс просто содержит переменные.

Затем я перетаскиваю этот список в файл, используя двоичный протокол 2, позже я заново запускаю скрипт, повторно извлекаю данные из моего источника, у меня есть новый список с моимПользовательские экземпляры классов, для тестирования я сохраняю данные исходных данных одинаковыми.

Перезагрузите файл pickle

Теперь, когда я делаю:

print source_list == pickle_list

, это всегда происходитназад False, и я понятия не имею, почему, если я распечатываю списки или смотрю на структуру, они выглядят одинаково.

Любые идеи были бы блестящими, это мой последний маленький кусочек, который мне нужно отсортировать.

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Ваши классы, вероятно, не определяют значимого __eq__, и, следовательно, сравниваются на предмет идентичности.Поскольку классы, загруженные из солений, не совпадают с объектами в сгенерированном списке (даже если они имеют одинаковые данные), вы получите False.

1 голос
/ 02 марта 2012

Сравнение двух объектов одного класса по умолчанию дает значение False (если они не являются одним и тем же одним объектом), даже если они имеют одинаковое содержимое;другими словами, два интуитивно «идентичных» объекта из одного и того же класса по умолчанию считаются разными.Вот пример:

>>> class C(object):
...     def __init__(self, value):
...         self.value = value
...         
>>> 
>>> C(12) == C(12)
False

Вы хотите определить __eq__()__ne__()) в своем пользовательском классе, чтобы он выдавал True для объектов, содержащих те же данные.Дополнительную информацию можно найти в официальной документации 1007 *.Для приведенного выше примера это будет:

>>> class C(object):
...     # ...
...     def __eq__(self, other):
...         return self.value == other.value
...     def __ne__(self, other):
...         return not self == other  # More general than self.value != other.value
...     
>>> C(12) == C(12)  # __eq__() is called
True
>>> C(12) != C(12)  # __ne__() is called
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...