Я довольно часто использую фанки в качестве ключей для словарей, и поэтому мне интересно, как правильно это сделать - и это происходит через реализацию хороших хэш-методов для моих объектов. Я знаю другие вопросы, заданные здесь как хороший способ реализовать хеш, но я хотел бы понять, как работает __hash__
по умолчанию для пользовательских объектов, и если можно положиться на него.
Я заметил, что mutables явно не сотрясается, поскольку hash({})
вызывает ошибку... но странно, пользовательские классы хешируются:
>>> class Object(object): pass
>>> o = Object()
>>> hash(o)
Итак, знает ли кто-нибудь, как работает эта функция по умолчанию? Понимая это, я хотел бы знать:
Можно ли полагаться на этот хэш по умолчанию, если я помещаю объекты того же типа, что и ключи словаря? например
key1 = MyObject()
key2 = MyObject()
key3 = MyObject()
{key1: 1, key2: 'blabla', key3: 456}
Можно ли полагаться на него, если я использую объекты разных типов в качестве ключей в словаре? например.
{int: 123, MyObject(10): 'bla', 'plo': 890}
И в последнем случае также, как убедиться, что мои пользовательские хэши не сталкиваются с встроенными хэшами? например:
{int: 123, MyObject(10): 'bla', MyObjectWithCustomHash(123): 890}