Доступ к элементам Plist в диктовке
-
07-07-2019 - |
Вопрос
У меня есть класс в модуле I, который читает файл plist (XML) и возвращает dict. Это очень удобно, потому что я могу сказать что-то вроде:
Data.ServerNow.Property().DefaultChart
Возвращает словарь свойств, в частности значение для DefaultChart
. Очень элегантно.
Однако сборка словаря таким способом завершается неудачей:
dict={'Data': 'text1', 'Name':'text2', 'Place':'text3]}
dict
выглядит в точности как диктат Plist.
Но когда я говорю
print TextNow.Data().Name
Я получаю ошибку
'dict' object has no attribute 'Name'
Но если я скажу
print TextNow.Data()['Name']
вдруг это работает!
Может кто-нибудь объяснить это поведение? Есть ли способ преобразовать dict в dict XML-ish?
Решение
Вы можете использовать переопределение getattr для обработки ключей словаря как атрибутов, например:
class xmldict(dict):
def __getattr__(self, attr):
try:
return object.__getattribute__(self, attr)
except AttributeError:
if attr in self:
return self[attr]
else:
raise
Так, например, если у вас будет следующий dict:
dict_ = {'a':'some text'}
Вы можете сделать это:
>> print xmldict(dict_).a
some text
>> print xmldict(dict_).NonExistent
Traceback (most recent call last):
...
AttributeError: 'xmldict' object has no attribute 'NonExistent'
Другие советы
Это не работает, потому что оператор точки не является правильным синтаксисом аксессора для словарей Python. Вы пытаетесь рассматривать его как объект и получить доступ к свойству, а не к элементу данных структуры данных.