48 lines
1.0 KiB
Python
48 lines
1.0 KiB
Python
|
# from http://mail.python.org/pipermail/python-dev/2001-June/015239.html
|
||
|
|
||
|
# if you keep changing a dictionary while looking up a key, you can
|
||
|
# provoke an infinite recursion in C
|
||
|
|
||
|
# At the time neither Tim nor Michael could be bothered to think of a
|
||
|
# way to fix it.
|
||
|
|
||
|
class Yuck:
|
||
|
def __init__(self):
|
||
|
self.i = 0
|
||
|
|
||
|
def make_dangerous(self):
|
||
|
self.i = 1
|
||
|
|
||
|
def __hash__(self):
|
||
|
# direct to slot 4 in table of size 8; slot 12 when size 16
|
||
|
return 4 + 8
|
||
|
|
||
|
def __eq__(self, other):
|
||
|
if self.i == 0:
|
||
|
# leave dict alone
|
||
|
pass
|
||
|
elif self.i == 1:
|
||
|
# fiddle to 16 slots
|
||
|
self.__fill_dict(6)
|
||
|
self.i = 2
|
||
|
else:
|
||
|
# fiddle to 8 slots
|
||
|
self.__fill_dict(4)
|
||
|
self.i = 1
|
||
|
|
||
|
return 1
|
||
|
|
||
|
def __fill_dict(self, n):
|
||
|
self.i = 0
|
||
|
dict.clear()
|
||
|
for i in range(n):
|
||
|
dict[i] = i
|
||
|
dict[self] = "OK!"
|
||
|
|
||
|
y = Yuck()
|
||
|
dict = {y: "OK!"}
|
||
|
|
||
|
z = Yuck()
|
||
|
y.make_dangerous()
|
||
|
print dict[z]
|