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