Я получал ту же проблему как Вы, однако мой опыт немного отличался.
я нахожусь на перспективе x64, мои разработчики находятся в xp x64... у них не было проблем вообще. Я просто обновил и не мог выполнить модульный тест на проект MVC asp.net. Я получал те же 500 ошибок, которые Вы получали.
я выключил покрытие кода, все волшебно начало работать.
Вы имеете в виду что-то вроде этого?
Используя специальный метод __ hash __
class test:
def __init__(self, name):
self.name = name
def __hash__(self):
return hash(self.name)
>>> hash(test(10)) == hash(test(20))
False
>>> hash(test(10)) == hash(test(10))
True
Имейте lool во встроенной функции hash () и методе объекта __ hash __ ()
. Возможно, это именно то, что вы ищете. Вам нужно будет реализовать __ hash __ ()
для ваших собственных классов.
Думаю,
def hash_attr(ins):
return hash(tuple(ins.__dict__.items()))
хеширует любой экземпляр на основе его атрибутов.
Чтобы получить уникальное сравнение:
Чтобы быть уникальным, вы можете сериализовать данные, а затем сравнить сериализованное значение, чтобы убедиться, что оно точно совпадает.
Пример:
import pickle
class C:
i = 1
j = 2
c1 = C()
c2 = C()
c3 = C()
c1.i = 99
unique_hash1 = pickle.dumps(c1)
unique_hash2 = pickle.dumps(c2)
unique_hash3 = pickle.dumps(c3)
unique_hash1 == unique_hash2 #False
unique_hash2 == unique_hash3 #True
Если вы не используете Не нужны уникальные значения для каждого объекта, но в основном уникальные:
Обратите внимание, что одно и то же значение всегда будет уменьшаться до одного и того же хэша, но два разных значения могут быть уменьшены до одного и того же хэша.
Вы не можете использовать что-то вроде встроенной функции hash () (если вы не переопределите __ hash __
)
hash(c1) == hash(c2) #False
hash(c2) == hash(c3) #False <--- Wrong
или что-то вроде сериализации данных с помощью pickle, а затем использования zlib.crc32.
import zlib
crc1 = zlib.crc32(pickle.dumps(c1))
crc2 = zlib.crc32(pickle.dumps(c2))
crc3 = zlib.crc32(pickle.dumps(c3))
crc1 == crc2 #False
crc2 == crc3 #True