Pregunta

Tengo una clase en un módulo I que lee un archivo plist (XML) y devuelve un dict. Esto es extremadamente conveniente porque puedo decir algo como:

Data.ServerNow.Property().DefaultChart

Esto devuelve un diccionario de propiedades, específicamente el valor de DefaultChart . Muy elegante. Sin embargo, el montaje de un diccionario de esta manera falla:

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

dict se ve exactamente como el Plist dict. Pero cuando digo

print TextNow.Data().Name

Me sale un error

 'dict' object has no attribute 'Name'

Pero si digo

print TextNow.Data()['Name']

¡de repente funciona!

¿Alguien puede explicar este comportamiento? ¿Hay alguna manera de convertir un dict a un dict XML-ish?

¿Fue útil?

Solución

Puede usar la redefinición de getattr para tratar las claves del diccionario como atributos, por ejemplo:

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

Entonces, por ejemplo, si tendrá el siguiente dict:

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

Puedes hacerlo:

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

Otros consejos

No funciona porque el operador de punto no es la sintaxis de acceso adecuada para los diccionarios de Python. Estás intentando tratarlo como un objeto y acceder a una propiedad, en lugar de acceder a un miembro de datos de la estructura de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top