Domanda

Ho una classe in un modulo I che legge un file plist (XML) e restituisce un dict. Questo è estremamente conveniente perché posso dire qualcosa del tipo:

Data.ServerNow.Property().DefaultChart

Restituisce un dizionario di proprietà, in particolare il valore per DefaultChart . Molto elegante. Tuttavia, l'assemblaggio di un dizionario in questo modo non riesce:

dict={'Data': 'text1', 'Name':'text2', 'Place':'text3]}

dict sembra esattamente come il dict di Plist. Ma quando dico

print TextNow.Data().Name

Ottengo l'errore

 'dict' object has no attribute 'Name'

Ma se dico

print TextNow.Data()['Name']

all'improvviso funziona!

Qualcuno può spiegare questo comportamento? C'è un modo per convertire un dict in un dict XML-ish?

È stato utile?

Soluzione

È possibile utilizzare la ridefinizione di getattr per trattare le chiavi del dizionario come attributi, ad esempio:

class xmldict(dict):
    def __getattr__(self, attr):
        try:
            return object.__getattribute__(self, attr)
        except AttributeError:
            if attr in self:
                return self[attr]
            else:
                raise

Quindi, per esempio se avrai il seguente dict:

dict_ = {'a':'some text'}

Puoi farlo:

>> print xmldict(dict_).a
some text
>> print xmldict(dict_).NonExistent
Traceback (most recent call last):
  ...
AttributeError: 'xmldict' object has no attribute 'NonExistent'

Altri suggerimenti

Non funziona perché l'operatore punto non è una sintassi di accesso corretta per i dizionari Python. Stai cercando di trattarlo come un oggetto e accedere a una proprietà, piuttosto che accedere a un membro dei dati della struttura dei dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top