|
|
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) |
|
|
|
|
|
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): |
|
|
|
|
|
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() |