from collections import OrderedDict class OrderedEasyDict(OrderedDict): """Using OrderedDict for the `easydict` package See Also https://pypi.python.org/pypi/easydict/ """ def __init__(self, d=None, **kwargs): super(OrderedEasyDict, self).__init__() if d is None: d = OrderedDict() if kwargs: d.update(**kwargs) for k, v in d.items(): setattr(self, k, v) # Class attributes for k in self.__class__.__dict__.keys(): if not (k.startswith('__') and k.endswith('__')): setattr(self, k, getattr(self, k)) def __setattr__(self, name, value): # special handling of self.__root and self.__map if name.startswith('_') and (name.endswith('__root') or name.endswith('__map')): super(OrderedEasyDict, self).__setattr__(name, value) else: if isinstance(value, (list, tuple)): value = [self.__class__(x) if isinstance(x, dict) else x for x in value] else: value = self.__class__(value) if isinstance(value, dict) else value super(OrderedEasyDict, self).__setattr__(name, value) super(OrderedEasyDict, self).__setitem__(name, value) __setitem__ = __setattr__ if __name__ == "__main__": import doctest doctest.testmod()