Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Hashability questions (http://www.velocityreviews.com/forums/t946215-hashability-questions.html)

Bob Grommes 05-13-2012 07:11 PM

Hashability questions
 
Noob alert: writing my first Python class library.

I have a straightforward class called Utility that lives in Utility.py.

I'm trying to get a handle on best practices for fleshing out a library. As such, I've done the following for starters:

def __str__(self):
return str(type(self))

# def __eq__(self,other):
# return hash(self) == hash(other)

The commented-out method is what I'm questioning. As-is, I can do the following from my test harness:

u = Utility()
print(str(u))
print(hash(u))
u2 = Utility()
print(hash(u2))
print(hash(u) == hash(u2))

However if I uncomment the above _eq_() implementation, I get the following output:

<class 'Utility.Utility'>
Traceback (most recent call last):
File "/Users/bob/PycharmProjects/BGC/Tests.py", line 7, in <module>
print(hash(u))
TypeError: unhashable type: 'Utility'

Process finished with exit code 1

Obviously there is some sort of default implementation of __hash__() at work and my implementation of _eq_() has somehow broken it. Can anyone explain what's going on?

alex23 05-15-2012 01:35 AM

Re: Hashability questions
 
On May 14, 5:11*am, Bob Grommes <bob.grom...@gmail.com> wrote:
> Obviously there is some sort of default implementation of __hash__()
> at work and my implementation of _eq_() has somehow broken it.
> Can anyone explain what's going on?


It looks like this has changed between Python 2 and 3:

"If a class does not define an __eq__() method it should not define a
__hash__() operation either; if it defines __eq__() but not
__hash__(), its instances will not be usable as items in hashable
collections."

From: http://docs.python.org/dev/reference...bject.__hash__

You should just be able to add a __hash__ to Utility and it'll be fine.

Bob Grommes 05-15-2012 02:52 PM

Re: Hashability questions
 
On Monday, May 14, 2012 8:35:36 PM UTC-5, alex23 wrote:
> It looks like this has changed between Python 2 and 3:
>
> "If a class does not define an __eq__() method it should not define a
> __hash__() operation either; if it defines __eq__() but not
> __hash__(), its instances will not be usable as items in hashable
> collections."
>
> From: http://docs.python.org/dev/reference...bject.__hash__
>
> You should just be able to add a __hash__ to Utility and it'll be fine.


Thanks, Alex. I should have mentioned I was using Python 3. I guess all this is a bit over-thought to just crank out some code -- in practice, comparing two classes for equality is mostly YAGNI -- but it's my way of coming to a reasonably in-depth understanding of how things work ...


All times are GMT. The time now is 01:03 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.