1# from http://mail.python.org/pipermail/python-dev/2001-June/015239.html
2
3# if you keep changing a dictionary while looking up a key, you can
4# provoke an infinite recursion in C
5
6# At the time neither Tim nor Michael could be bothered to think of a
7# way to fix it.
8
9class Yuck:
10    def __init__(self):
11        self.i = 0
12
13    def make_dangerous(self):
14        self.i = 1
15
16    def __hash__(self):
17        # direct to slot 4 in table of size 8; slot 12 when size 16
18        return 4 + 8
19
20    def __eq__(self, other):
21        if self.i == 0:
22            # leave dict alone
23            pass
24        elif self.i == 1:
25            # fiddle to 16 slots
26            self.__fill_dict(6)
27            self.i = 2
28        else:
29            # fiddle to 8 slots
30            self.__fill_dict(4)
31            self.i = 1
32
33        return 1
34
35    def __fill_dict(self, n):
36        self.i = 0
37        dict.clear()
38        for i in range(n):
39            dict[i] = i
40        dict[self] = "OK!"
41
42y = Yuck()
43dict = {y: "OK!"}
44
45z = Yuck()
46y.make_dangerous()
47print dict[z]
48