Форум сайта python.su
0
Добрый день
возможно я не прав, не знаю насколько это правильно делать в питоне, хочу использовать в качестве ключа словаря свой класс отнаследованный от 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)
Офлайн
857
На нехешируемых значениях 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 >>>
Отредактировано py.user.next (Июнь 24, 2015 00:24:37)
Офлайн
186
> подскажите пожалуйста, сильно ли плохо будет использовать реализацию вида
Конечно плохо. Выбери несколько значений в качестве ключа хеширования и используй их, а не весь объект.
Офлайн