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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top