File size: 1,393 Bytes
6021dd1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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() |