base.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. # -*- coding: utf-8 -*-
  2. __all__ = ("Map", "WeixinError")
  3. try:
  4. unicode = unicode
  5. except NameError:
  6. # python 3
  7. basestring = (str, bytes)
  8. else:
  9. # python 2
  10. bytes = str
  11. class WeixinError(Exception):
  12. def __init__(self, msg):
  13. super(WeixinError, self).__init__(msg)
  14. class Map(dict):
  15. """
  16. 提供字典的dot访问模式
  17. Example:
  18. m = Map({'first_name': 'Eduardo'}, last_name='Pool', age=24, sports=['Soccer'])
  19. """
  20. def __init__(self, *args, **kwargs):
  21. super(Map, self).__init__(*args, **kwargs)
  22. for arg in args:
  23. if isinstance(arg, dict):
  24. for k, v in arg.items():
  25. if isinstance(v, dict):
  26. v = Map(v)
  27. self[k] = v
  28. if kwargs:
  29. for k, v in kwargs.items():
  30. if isinstance(v, dict):
  31. v = Map(v)
  32. self[k] = v
  33. def __getattr__(self, attr):
  34. return self[attr]
  35. def __setattr__(self, key, value):
  36. self.__setitem__(key, value)
  37. def __getitem__(self, key):
  38. if key not in self.__dict__:
  39. super(Map, self).__setitem__(key, {})
  40. self.__dict__.update({key: Map()})
  41. return self.__dict__[key]
  42. def __setitem__(self, key, value):
  43. super(Map, self).__setitem__(key, value)
  44. self.__dict__.update({key: value})
  45. def __delattr__(self, item):
  46. self.__delitem__(item)
  47. def __delitem__(self, key):
  48. super(Map, self).__delitem__(key)
  49. del self.__dict__[key]