2014-11-15 18:30:01 +00:00
|
|
|
# test builtin hash function
|
|
|
|
|
2015-01-29 00:44:11 +00:00
|
|
|
print(hash(False))
|
|
|
|
print(hash(True))
|
|
|
|
print({():1}) # hash tuple
|
|
|
|
print({1 << 66:1}) # hash big int
|
2015-10-01 18:49:37 +01:00
|
|
|
print({-(1 << 66):2}) # hash negative big int
|
2015-01-29 00:44:11 +00:00
|
|
|
print(hash in {hash:1}) # hash function
|
|
|
|
|
|
|
|
try:
|
|
|
|
hash([])
|
|
|
|
except TypeError:
|
|
|
|
print("TypeError")
|
|
|
|
|
2014-11-15 18:30:01 +00:00
|
|
|
class A:
|
|
|
|
def __hash__(self):
|
|
|
|
return 123
|
|
|
|
def __repr__(self):
|
|
|
|
return "a instance"
|
|
|
|
|
|
|
|
print(hash(A()))
|
|
|
|
print({A():1})
|
2015-05-04 20:41:32 +01:00
|
|
|
|
2015-05-11 13:25:19 +01:00
|
|
|
# all user-classes have default __hash__
|
2015-05-04 20:41:32 +01:00
|
|
|
class B:
|
|
|
|
pass
|
|
|
|
hash(B())
|
|
|
|
|
2015-05-11 13:25:19 +01:00
|
|
|
# if __eq__ is defined then default __hash__ is not used
|
2015-05-04 20:41:32 +01:00
|
|
|
class C:
|
|
|
|
def __eq__(self, another):
|
|
|
|
return True
|
|
|
|
try:
|
|
|
|
hash(C())
|
|
|
|
except TypeError:
|
|
|
|
print("TypeError")
|
2015-05-11 13:25:19 +01:00
|
|
|
|
|
|
|
# __hash__ must return an int
|
|
|
|
class D:
|
|
|
|
def __hash__(self):
|
|
|
|
return None
|
|
|
|
try:
|
|
|
|
hash(D())
|
|
|
|
except TypeError:
|
|
|
|
print("TypeError")
|
2015-05-12 23:08:18 +01:00
|
|
|
|
|
|
|
# __hash__ returning a bool should be converted to an int
|
|
|
|
class E:
|
|
|
|
def __hash__(self):
|
|
|
|
return True
|
|
|
|
print(hash(E()))
|
|
|
|
|
|
|
|
# __hash__ returning a large number should be truncated
|
|
|
|
class F:
|
|
|
|
def __hash__(self):
|
|
|
|
return 1 << 70 | 1
|
|
|
|
print(hash(F()) != 0)
|