Accéder aux articles Plist dans un dict
-
07-07-2019 - |
Question
J'ai une classe dans un module I qui lit un fichier plist (XML) et retourne un dict. Ceci est extrêmement pratique car je peux dire quelque chose comme:
Data.ServerNow.Property().DefaultChart
Ceci renvoie un dictionnaire de propriétés, en particulier la valeur de DefaultChart
. Très élégant.
Cependant, l’assemblage d’un dictionnaire de cette manière échoue:
dict={'Data': 'text1', 'Name':'text2', 'Place':'text3]}
dict
ressemble exactement au dict de Plist.
Mais quand je dis
print TextNow.Data().Name
Je reçois une erreur
'dict' object has no attribute 'Name'
Mais si je dis
print TextNow.Data()['Name']
tout à coup cela fonctionne!
Quelqu'un peut-il expliquer ce comportement? Existe-t-il un moyen de convertir un dict en XML-ish dict?
La solution
Vous pouvez utiliser la redéfinition de getattr pour traiter les clés de dictionnaire comme des attributs, par exemple:
.class xmldict(dict):
def __getattr__(self, attr):
try:
return object.__getattribute__(self, attr)
except AttributeError:
if attr in self:
return self[attr]
else:
raise
Ainsi, par exemple, si vous souhaitez suivre le dict suivant:
dict_ = {'a':'some text'}
Vous pouvez le faire:
>> print xmldict(dict_).a
some text
>> print xmldict(dict_).NonExistent
Traceback (most recent call last):
...
AttributeError: 'xmldict' object has no attribute 'NonExistent'
Autres conseils
Cela ne fonctionne pas car l'opérateur point n'est pas la syntaxe d'accès appropriée pour les dictionnaires python. Vous essayez de le traiter comme un objet et d’accéder à une propriété plutôt que d’accéder à un membre de la structure de données.