anarchokawaii
anarchokawaii

Reputation: 116

Why is this causing a recursion error

I tried what was recommended here https://stackoverflow.com/a/41112823/5618523 but i am still having problems

class AppendiveDict(c.OrderedDict):
    def __init__(self,func,*args):
        self.func = func
        c.OrderedDict.__init__(self,args)
    def __setitem__(self, key, value,):
        if key in self:
            self[key] = self.func(self[key])
        else:
            c.OrderedDict.__setitem__(self,key,value)
a = AppendiveDict((lambda y: y + "sdf"),("a","b"),("c","d"),("e","f"),("a","b"))
a

the point of this class is that it is suppose to apply a function for items already in dict when it reencounters the item.

1

RecursionError                            Traceback (most recent call last)
<ipython-input-15-b4bd349c86bf> in <module>()
     11         else:
     12             c.OrderedDict.__setitem__(self,key,value)
---> 13 a = AppendiveDict((lambda y: y + "sdf"),("a","b"),("c","d"),("e","f"),("a","b"))
     14 a

2

<ipython-input-15-b4bd349c86bf> in __init__(self, func, *args)
      5     def __init__(self,func,*args):
      6         self.func = func
----> 7         c.OrderedDict.__init__(self,args)
      8     def __setitem__(self, key, value,):
      9         if key in self:

3

<ipython-input-15-b4bd349c86bf> in __setitem__(self, key, value)
      8     def __setitem__(self, key, value,):
      9         if key in self:
---> 10             self[key] = self.func(self[key])
     11         else:
     12             c.OrderedDict.__setitem__(self,key,value)

number 3 just repeats .if i put self.func after c.OrderedDict.init(self,args) it causes an attribute error saying self.func doesn't exist.

Upvotes: 0

Views: 124

Answers (1)

salparadise
salparadise

Reputation: 5805

because self[key] calls __setitem__ again, you can try:

def __setitem__(self, key, value,):
        if key in self:
            c.OrderedDict.__setitem__(self, key, self.func(value))

edit: Although re-reading, you intended to modify the current set value:

def __setitem__(self, key, value):
    if key in self:
        c.OrderedDict.__setitem__(self, key, self.func(self[key]))

works too, if that is what you are after.

Upvotes: 2

Related Questions