Accesso agli oggetti Plist in un dict
-
07-07-2019 - |
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?
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.