Guest User

Untitled

a guest
Jun 21st, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1.  
  2. class SpecialNone(object):
  3. pass
  4.  
  5. class OrderedDict (object):
  6. _list = 0
  7. _listmap = 0
  8. _classname = 0
  9.  
  10. def __init__(self, val={}):
  11. object.__init__(self)
  12. self._list = []
  13. self._classname = "OrderedDict"
  14. self._listmap = dict(val)
  15.  
  16. def addvals(self, key):
  17. vlst = self.listvals(key)
  18.  
  19. for v in vlst[1:]:
  20. if type(vlst[0]) == list and type(v) != list:
  21. v = [v]
  22.  
  23. vlst[0] += v
  24.  
  25. return vlst[0]
  26.  
  27. def listvals(self, key):
  28. return [v[0] for v in self._listmap[key]]
  29.  
  30. def last(self, key):
  31. """
  32. get the last-added value to a key
  33. """
  34. lst = self._listmap[key]
  35.  
  36. return lst[-1][0]
  37.  
  38. def __setitem__(self, key, val):
  39. if key in self._listmap:
  40. lst = self._listmap[key]
  41.  
  42. val2 = SpecialNone
  43. for v in lst:
  44. if v[0] == val:
  45. val2 = v[0]
  46. break
  47.  
  48. if val2 == SpecialNone:
  49. lst.append([val, len(self._list)])
  50. else:
  51. self._listmap[key] = [[val, len(self._list)]]
  52.  
  53. self._list.append([key, val])
  54.  
  55. def __len__(self):
  56. return len(self._list)
  57.  
  58. def __getitem__(self, key):
  59. lst = self._listmap[key]
  60.  
  61. if len(lst) == 1: return lst[0][0]
  62. else: return [val[0] for val in lst]
  63.  
  64. def __iter__(self):
  65. def iter(d):
  66. for k, v in d._list:
  67. yield k
  68.  
  69. return iter(self)
  70.  
  71. def iteritems(self):
  72. def iter(d):
  73. for k, v in d._list:
  74. yield (k, v)
  75.  
  76. return iter(self)
  77.  
  78. def keys(self):
  79. lst = []
  80. for k, v in self._list:
  81. lst.append(k)
  82.  
  83. return lst
  84.  
  85. def values(self):
  86. lst = []
  87. for k, v in self._list:
  88. lst.append(v)
  89.  
  90. return lst
  91.  
  92.  
  93. def __str__(self):
  94. return repr(self)
  95.  
  96. def __repr__(self):
  97. s = self._classname + "({"
  98.  
  99. i = 0
  100. for k, v in self.iteritems():
  101. if i != 0: s += ", "
  102. s += repr(k) + " : " + repr(v)
  103. i += 1
  104.  
  105. s += "})"
  106.  
  107. return s
  108.  
  109. class AttributeDict (OrderedDict):
  110. def __init__(self, val={}):
  111. OrderedDict.__init__(self, val)
  112. self._classname = "AttributeDict"
  113.  
  114. def __getattribute__(self, attr):
  115. if attr in OrderedDict.__getattribute__(self, "__dict__"):
  116. return OrderedDict.__getattribute__(self, attr)
  117. else:
  118. if attr in self:
  119. return self[attr]
  120. else: return OrderedDict.__getattribute__(self, attr)
  121.  
  122.  
  123. def __setattr__(self, attr, val):
  124. if attr in OrderedDict.__getattribute__(self, "__dict__") or attr in \
  125. ["_list", "_listmap", "_classname", "_listmap"]:
  126. OrderedDict.__setattr__(self, attr, val)
  127. else:
  128. self[attr] = val
  129.  
  130. def prettystr(self, tlevel=0):
  131. t = ""
  132. for i in xrange(tlevel):
  133. t += " "
  134.  
  135. s = "{\n"
  136. for k, v in self.iteritems():
  137. if type(v) == AttributeDict:
  138. s += t + " " + k + ": " + v.prettystr(tlevel+1) + "\n"
  139. else:
  140. s += t + " " + k + ": " + str(v) + "\n"
  141.  
  142. s += t + "}\n"
  143.  
  144. return s
Add Comment
Please, Sign In to add comment