2016-06-13 16 views
1

der folgende Code in PythonAdd verschachtelte Attribute

def _say(x): return x 

class newObject(object): 

    def __init__(self, **kw): 
     for x in kw: 
      self.x = kw[x] 
      for i in self.x: 
       a = self.x[i] 
       eval('self.x.{u}={t}'.format(u=i, t=a)) #on another note, why would setattr(self.x, i, a) not work 
     self.object_ret() 

    def object_ret(self): 
     return self 

data = newObject(**{ 
     'ranks':{ 
      'one':['yhggti','aragos','raithinki'], 
      'two':['grythin','radios'], 
      'three':['riyoken','schrodinger']}, 
     'nicknames':{ 
      'riyoken':['theos','arahiron'], 
      'illogic':['harab','thing']}, 
     'commands':{ 
      'say':_say}, 
     }) 

umreißt, wie ich weitere Attribute zu einem Objekt auf dem Ende eines anderen Attribut hinzufügen möchten. Früher habe ich es haben wie

class newObject(object): 

    def __init__(self, **kw): 
     [setattr(self, x, kw[x]) for x in kw] 
     self.object_ret() 

wo data.nicknames >>> data.nicknames {'illogic': ['harab', 'thing'], 'riyoken': ['theos', 'arahiron']} jetzt zurückkehren würde ich wollte ['theos', 'arahiron'] in der Lage sein zu nennen data.nicknames.riyoken und zurück, die nicht mit dem ursprünglichen Setup daher der obere Bereich arbeiten würde des Codes. Der eval('self.x.{u}={t}'.format(u=i, t=a)) Teil jedoch Fehler und gibt etwas wie File "<string>", line 1 self.x.say=<function _say at 0x030E9420> ^ SyntaxError: invalid syntax wenn es eine Möglichkeit gibt, dies zu arbeiten, wo ich data.nicknames.riyoken oder dat.commands.say nennen würde es sehr geschätzt werden.

+0

'setattr (self.x, ich, a)' sollte gut funktionieren. Was ist passiert, als du es versucht hast? –

+0

17, in __init__ setattr (self.x, ich, a) AttributeError: 'dict' Objekt hat kein Attribut 'zwei' – user3723955

+0

Ich sehe jetzt. Tatsächlich können Sie Attribute für ein dict (und viele andere eingebaute Typen) nicht setzen. –

Antwort

1

Sie haben ein paar Dinge durcheinander gebracht. Hier ist eine Arbeitsversion, die Ihren Code Nähe:

class Attributes: 
    pass 

class NewObject(object): 
    def __init__(self, **kw): 
     for x in kw: 
      attrs = Attributes() 
      setattr(self, x, attrs) 
      for i in kw[x]: 
       a = kw[x][i] 
       setattr(attrs, i, a) 

Und hier ist, wie ich es tun würde:

class NewObject(object): 
    def __init__(self, **kwargs): 
     for key, value in kwargs.items(): 
      if isinstance(value, dict): 
       value = NewObject(**value) 
      setattr(self, key, value) 

Dies wird Griff beliebig verschachtelte dicts.

0

Warum übergeben Sie Daten nicht als Parameter an die Klasse, wenn Sie sie initialisieren? Also muss die Klasse ein Wörterbuch als Argument nehmen. Nicht sicher, ob ich hier etwas verpasse.

+0

Dies sollte ein Kommentar sein. –

+0

Ich weiß ... ich habe nicht genug Reputation> :( –

+0

Nun löschen Sie dies, weil es jetzt schlechter ist. –

Verwandte Themen