fork download
  1. class DotDictionary(dict):
  2.  
  3. def __init__(self, init_value):
  4. if not isinstance(init_value, dict):
  5. raise TypeError('Expected dict, got {}'.format(type(init_value)))
  6.  
  7. self._dict_to_self(init_value)
  8. super(DotDictionary, self).__init__()
  9.  
  10. def __getattr__(self, name):
  11. return self[name]
  12.  
  13. def __setattr__(self, name, val):
  14. if isinstance(val, dict):
  15. val = DotDictionary(val)
  16. self[name] = val
  17.  
  18. def __setitem__(self, name, val):
  19. if isinstance(val, dict):
  20. val = DotDictionary(val)
  21.  
  22. super(DotDictionary, self).__setitem__(name, val)
  23.  
  24. def __delattr__(self, name):
  25. del self[name]
  26.  
  27. def _dict_to_self(self, dct):
  28. for key, value in dct.items():
  29. if isinstance(value, (tuple, list)):
  30. for i, _ in enumerate(value):
  31. if isinstance(value[i], dict):
  32. value[i] = DotDictionary(value[i])
  33. self[key] = value
  34.  
  35.  
  36. d = {'a': 0,
  37. 'b': {'aa': 1, 'bb': {'aaa': 2, 'bbb': 3, 'ccc': {'aaaa': 4}}},
  38. 'c': [5, {'aaaaa': 6, 'bbbbb': 7, 'ccccc': [{'aaaaaa': 8}]}]}
  39.  
  40. dd = DotDictionary(d)
  41. dd['dict'] = {'hey': 'hey'}
  42. dd.dict.hello = {'hello': 123}
  43.  
  44. print(dd.a)
  45. print(dd.b.aa)
  46. print(dd.c[1].aaaaa)
  47. print(dd.c[1].ccccc[0].aaaaaa)
  48. print(dd.dict.hey)
  49. print(dd.dict.hello.hello)
  50.  
Success #stdin #stdout 0.02s 9984KB
stdin
Standard input is empty
stdout
0
1
6
8
hey
123