/pod/dict.py

http://pickled-object-database.googlecode.com/ · Python · 108 lines · 80 code · 27 blank · 1 comment · 22 complexity · 16cff4f9583846e456fa1a003108f434 MD5 · raw file

  1. import exceptions
  2. import core
  3. import typed
  4. import query
  5. import fn
  6. class PodDictError(exceptions.BaseException):
  7. pass
  8. class Dict(core.Object):
  9. def __init__(self, dict = None, **kwargs):
  10. core.Object.__init__(self, **kwargs)
  11. if dict:
  12. self.update(other = dict)
  13. def __len__(self):
  14. get_one = query.RawQuery(select = fn.count(DictItem.id) >> 'count', where = DictItem.parent == self).get_one()
  15. if get_one:
  16. return get_one.count
  17. def __getitem__(self, key, return_node = False):
  18. item = core.Query(select = DictItem.value, where = (DictItem.parent == self) & (DictItem.key == key)).get_one()
  19. if item:
  20. return item.value
  21. else:
  22. raise KeyError
  23. def __setitem__(self, key, value):
  24. item = ((DictItem.parent == self) & (DictItem.key == key)).get_one()
  25. if item:
  26. item.value = value
  27. else:
  28. DictItem(parent = self, key = key, value = value)
  29. def __delitem__(self, key):
  30. item = core.Query(select = DictItem.value, where = (DictItem.parent == self) & (DictItem.key == key)).get_one()
  31. if item:
  32. return item.delete()
  33. else:
  34. raise KeyError
  35. def __contains__(self, key):
  36. return True if ((DictItem.parent == self) & (DictItem.key == key)).get_one() else False
  37. def __iter__(self):
  38. return self.iterkeys()
  39. def update(self, other):
  40. for key,value in other.iteritems():
  41. self[key] = value
  42. def clear(self):
  43. (DictItem.parent == self).delete()
  44. def copy(self):
  45. return dict([(key,value) for key,value in self.iteritems()])
  46. def get(self, key, default = None):
  47. try:
  48. return query.Query(select = DictItem.value, where = (DictItem.parent == self) & (DictItem.key == key)).get_one().value
  49. except AttributeError:
  50. return default
  51. def setdefault(self, key, default):
  52. try:
  53. return query.Query(select = DictItem.value, where = (DictItem.parent == self) & (DictItem.key == key)).get_one().value
  54. except AttributeError:
  55. self.__setitem__(key, default)
  56. return default
  57. def keys(self):
  58. return [item.key for item in core.Query(select = DictItem.key, where = DictItem.parent == self)]
  59. def iterkeys(self):
  60. return (item.key for item in core.Query(select = DictItem.key, where = DictItem.parent == self))
  61. def values(self):
  62. return [item.value for item in core.Query(select = DictItem.value, where = DictItem.parent == self)]
  63. def itervalues(self):
  64. return (item.value for item in core.Query(select = DictItem.value, where = DictItem.parent == self))
  65. def items(self):
  66. return [(item.key,item.value) for item in core.Query(select = DictItem.key | DictItem.value, where = DictItem.parent == self)]
  67. def iteritems(self):
  68. return ((item.key,item.value) for item in core.Query(select = DictItem.key | DictItem.value, where = DictItem.parent == self))
  69. """ Not Supported """
  70. def fromkeys(self):
  71. raise PodDictError, "method fromkeys not implemented . . ."
  72. def has_key(self):
  73. raise PodDictError, "method has_key not implemented, use 'in' or __contains__ instead . . ."
  74. def pop(self, key, *args, **kwargs):
  75. raise PodDictError, "method pop is not implemented . . ."
  76. def popitem(self):
  77. raise PodDictError, "method popitem is not implemented . . ."
  78. class DictItem(core.Object):
  79. parent = typed.PodObject(index = True)
  80. key = typed.Object(index = True)
  81. value = typed.Object(index = False)