115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# from http://mail.python.org/pipermail/python-dev/2001-June/015239.html
215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# if you keep changing a dictionary while looking up a key, you can
415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# provoke an infinite recursion in C
515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# At the time neither Tim nor Michael could be bothered to think of a
715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson# way to fix it.
815b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
915b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsonclass Yuck:
1015b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson    def __init__(self):
1115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        self.i = 0
1215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
1315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson    def make_dangerous(self):
1415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        self.i = 1
1515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
1615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson    def __hash__(self):
1715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        # direct to slot 4 in table of size 8; slot 12 when size 16
1815b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        return 4 + 8
1915b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
2015b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson    def __eq__(self, other):
2115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        if self.i == 0:
2215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson            # leave dict alone
2315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson            pass
2415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        elif self.i == 1:
2515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson            # fiddle to 16 slots
2615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson            self.__fill_dict(6)
2715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson            self.i = 2
2815b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        else:
2915b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson            # fiddle to 8 slots
3015b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson            self.__fill_dict(4)
3115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson            self.i = 1
3215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
3315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        return 1
3415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
3515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson    def __fill_dict(self, n):
3615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        self.i = 0
3715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        dict.clear()
3815b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        for i in range(n):
3915b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson            dict[i] = i
4015b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson        dict[self] = "OK!"
4115b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
4215b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsony = Yuck()
4315b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsondict = {y: "OK!"}
4415b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudson
4515b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsonz = Yuck()
4615b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsony.make_dangerous()
4715b1f146bc2d62ac1bfb8924cf799672ac3a61feMichael W. Hudsonprint dict[z]
48