|
|
|
|
|
|
|
|
|
|
|
|
|
import json |
|
|
|
|
|
class AttrDict: |
|
def __init__(self, entries): |
|
self.add_entries_(entries) |
|
|
|
def keys(self): |
|
return self.__dict__.keys() |
|
|
|
def values(self): |
|
return self.__dict__.values() |
|
|
|
def __getitem__(self, key): |
|
return self.__dict__[key] |
|
|
|
def __setitem__(self, key, value): |
|
self.__dict__[key] = value |
|
|
|
def __delitem__(self, key): |
|
return self.__dict__.__delitem__(key) |
|
|
|
def __contains__(self, key): |
|
return key in self.__dict__ |
|
|
|
def __repr__(self): |
|
return self.__dict__.__repr__() |
|
|
|
def __getattr__(self, attr): |
|
if attr.startswith("__"): |
|
return self.__getattribute__(attr) |
|
return self.__dict__[attr] |
|
|
|
def items(self): |
|
return self.__dict__.items() |
|
|
|
def __iter__(self): |
|
return iter(self.items()) |
|
|
|
def add_entries_(self, entries, overwrite=True): |
|
for key, value in entries.items(): |
|
if key not in self.__dict__: |
|
if isinstance(value, dict): |
|
self.__dict__[key] = AttrDict(value) |
|
else: |
|
self.__dict__[key] = value |
|
else: |
|
if isinstance(value, dict): |
|
self.__dict__[key].add_entries_(entries=value, overwrite=overwrite) |
|
elif overwrite or self.__dict__[key] is None: |
|
self.__dict__[key] = value |
|
|
|
def serialize(self): |
|
return json.dumps(self, default=self.obj_to_dict, indent=4) |
|
|
|
def obj_to_dict(self, obj): |
|
return obj.__dict__ |
|
|
|
def get(self, key, default=None): |
|
return self.__dict__.get(key, default) |
|
|