Acceso a elementos de Plist en un dict
-
07-07-2019 - |
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?
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.