Вопрос

У меня есть класс в модуле 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. Вы пытаетесь рассматривать его как объект и получить доступ к свойству, а не к элементу данных структуры данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top