# 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]

