TypeError when creating frozenset with no hash

Terry Reedy tjreedy at udel.edu
Sat Mar 14 21:41:41 EDT 2009


andrew cooke wrote:
> I was going to file a bug report for this, but then I wondered if it was
> considered normal behaviour.  Am I wrong in thinking there should be a
> better error message?
> 
>>>> class NoHash:
> ...   def __hash__(self):
> ...     pass
> ...
>>>> frozenset([NoHash()])
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> TypeError: an integer is required
> 
> I understand that there is a real problem here (in my code I had forgotten
> the "return"); the issue is whether the stack trace should contain some
> reference to __hash__ or similar.  Perhaps that is impossible for
> containers implemented in C?

The error message comes from the internal call of hash().

 >>> class C():
	def __hash__(s): return 'a'
 >>> hash(C())
Traceback (most recent call last):
   File "<pyshell#7>", line 1, in <module>
     hash(C())
TypeError: an integer is required

This could be improved to
TypeError: hash must be an integer # or even
TypeError: hash must be integer, not <returned object.__class__>
(but someone would have to write a patch and most devs have other 
priorities.)

The same is true for unhashable types

 >>> class C():
	__hash__ = None

 >>> hash(C())
Traceback (most recent call last):
   File "<pyshell#35>", line 1, in <module>
     hash(C())
TypeError: unhashable type: 'C'

 >>> set([[]])
Traceback (most recent call last):
   File "<pyshell#37>", line 1, in <module>
     set([[]])
TypeError: unhashable type: 'list'

Terry Jan Reedy





More information about the Python-list mailing list