ObjDict v.1.0 — Словарь как объект
После длительного общения с JS, в Python, иногда, разобрав очередной JSON в словарь мне очень не хватало обращения к его вложенным элементам используя точечную нотацию (как у объектов, в JS ведь все объекты).
Хотелось вместо громоздкого json[’a’][’b’][’c’] использовать изящное json.a.b.c обращение.
Представляю вашему вниманию простой класс-обертку на базе базовых словарей, достаточно просто «обернуть» им словарь, после чего, к нему можно обращаться как к объекту используя точечную нотацию как у JS.
Класс objdict — расширяет dict, позволяя обращаться к его свойствам, как к атрибутам object-a, но при этом, сохраняя его полноценным dict-ом.
class objdict(dict):
def __init__(self, *args, **kwargs ):
dict.__init__(self, *args, **kwargs )
for key, value in self.items():
if isinstance(value, dict):
self[key] = objdict(value)
def __getattr__(self, name):
if name in self:
return self[name]
else:
raise AttributeError("No such attribute: " + name)
def __setattr__(self, name, value):
self[name] = value
def __delattr__(self, name):
if name in self:
del self[name]
else:
raise AttributeError("No such attribute: " + name)
Пример использования dot-нотации (присваивание тоже доступно):
>>> my_dict = {'a': {'b': {'c': 'OK'}}}
{'a': {'b': {'c': 'OK'}}}
>>> my_dict.a.b.c # пример ошибки
AttributeError: 'dict' object has no attribute 'a'
>>> my_objdict = objdict(my_dict) # преобразуем в objdict
>>> my_objdict # внешне остается таким же словарем, но...
{'a': {'b': {'c': 'OK'}}}
>>> my_objdict.a.b.c # получить свойство на 3-м уровне проще простого
'OK'
>>> my_objdict.a.b = 'END' # задать или удалить значение тоже не составляет труда
>>> my_objdict.a.b
{'a': {'b': 'END'}}
@ToDo: В версии 1.1 планирую добавить .get() обработчик с форматом objdict.get(’a.b.c’, ’default value’) для получения значения без необходимости перехвата AttributeError, будет еще более удобным для работы c JSON.