Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Hashability questions

Reply
Thread Tools

Hashability questions

 
 
Bob Grommes
Guest
Posts: n/a
 
      05-13-2012
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?
 
Reply With Quote
 
 
 
 
alex23
Guest
Posts: n/a
 
      05-15-2012
On May 14, 5:11*am, Bob Grommes <(E-Mail Removed)> 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.
 
Reply With Quote
 
 
 
 
Bob Grommes
Guest
Posts: n/a
 
      05-15-2012
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 ...
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
how to test for atomicity/mutability/hashability? kj Python 4 10-07-2010 09:22 PM
hashability James Stroud Python 20 08-12-2009 06:41 PM
Hashability? Chris S. Python 5 07-19-2004 06:58 PM
Re: Questions....questions....questions Patrick Michael A+ Certification 0 06-16-2004 04:53 PM
Hashability of classes, old and new =?iso-8859-1?Q?Fran=E7ois?= Pinard Python 1 02-16-2004 07:10 PM



Advertisments