mirror of https://github.com/python/cpython
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])
|