Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 23, 2015 16:59:38

qwertun
Зарегистрирован: 2015-05-19
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

дефолтные __hash__() и __eq__()

Добрый день

возможно я не прав, не знаю насколько это правильно делать в питоне, хочу использовать в качестве ключа словаря свой класс отнаследованный от object
смотрю на дефолтную реализацию метода object.__hash__() и берет меня сомнение, в ее низкой коллизионной стойкости (
подскажите пожалуйста, сильно ли плохо будет использовать реализацию вида

def __hash__(self):
return hash(tuple(vars(self).values()))

вместо дефолтной?

и вот еще, как работает дефолтный __eq__() ? что-то на подобии

def __eq__(self, other):
if not isinstance(other, self.__class__):
return False

return vars(self) == vars(other)

Отредактировано qwertun (Июнь 23, 2015 17:00:05)

Офлайн

#2 Июнь 24, 2015 00:12:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

дефолтные __hash__() и __eq__()

На нехешируемых значениях hash() выпадает.

>>> class A:
...     def __init__(self):
...         self.i = []
...     def __hash__(self):
...         print(vars(self).values())
...         return hash(tuple(vars(self).values()))
... 
>>> hash(A())
dict_values([[]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in __hash__
TypeError: unhashable type: 'list'
>>>

Если можешь собрать из объекта уникальный кортеж хешируемых объектов, то можно возвращать его хеш.

qwertun
и вот еще, как работает дефолтный __eq__() ? что-то на подобии
>>> class A:
...   pass
... 
>>> a1, a2 = A(), A()
>>> a1 == a1
True
>>> a1 == a2
False
>>>
Походу, через id() он работает.



Отредактировано py.user.next (Июнь 24, 2015 00:24:37)

Офлайн

#3 Июнь 24, 2015 14:43:48

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

дефолтные __hash__() и __eq__()

> подскажите пожалуйста, сильно ли плохо будет использовать реализацию вида

Конечно плохо. Выбери несколько значений в качестве ключа хеширования и используй их, а не весь объект.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version