2016-12-20 1 views
0

Я попробовал то, что было рекомендовано здесь https://stackoverflow.com/a/41112823/5618523, но я все еще возникают проблемыПочему это вызывает ошибку рекурсии

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 

точка этого класса является то, что это, предполагают, чтобы применить функцию для элементов уже в Словаре когда это он перезаписывает элемент.

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 
<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: 
<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) 

номер 3 просто повторяет .if я поставил self.func после c.OrderedDict. init (self, args) вызывает ошибку атрибута, говорящий, что self.func не существует.

+0

'self [key] = xxx' вызывает' self .__ setitem __ (key, xxx) ', который является бесконечной рекурсией. – thebjorn

ответ

2

потому что self[key] звонки __setitem__ снова, вы можете попробовать:

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

редактировать: Хотя перечитывая, вы намеревались изменить текущее заданное значение:

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

тоже работает, если это то, что вам нужно.