
Hashing is now done using mp_unary_op function with MP_UNARY_OP_HASH as the operator argument. Hashing for int, str and bytes still go via fast-path in mp_unary_op since they are the most common objects which need to be hashed. This lead to quite a bit of code cleanup, and should be more efficient if anything. It saves 176 bytes code space on Thumb2, and 360 bytes on x86. The only loss is that the error message "unhashable type" is now the more generic "unsupported type for __hash__".
45 lines
758 B
Python
45 lines
758 B
Python
# test builtin hash function
|
|
|
|
print(hash(False))
|
|
print(hash(True))
|
|
print({():1}) # hash tuple
|
|
print({1 << 66:1}) # hash big int
|
|
print(hash in {hash:1}) # hash function
|
|
|
|
try:
|
|
hash([])
|
|
except TypeError:
|
|
print("TypeError")
|
|
|
|
class A:
|
|
def __hash__(self):
|
|
return 123
|
|
def __repr__(self):
|
|
return "a instance"
|
|
|
|
print(hash(A()))
|
|
print({A():1})
|
|
|
|
# all user-classes have default __hash__
|
|
class B:
|
|
pass
|
|
hash(B())
|
|
|
|
# if __eq__ is defined then default __hash__ is not used
|
|
class C:
|
|
def __eq__(self, another):
|
|
return True
|
|
try:
|
|
hash(C())
|
|
except TypeError:
|
|
print("TypeError")
|
|
|
|
# __hash__ must return an int
|
|
class D:
|
|
def __hash__(self):
|
|
return None
|
|
try:
|
|
hash(D())
|
|
except TypeError:
|
|
print("TypeError")
|