PageRenderTime 26ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/flask/Lib/UserDict.py

https://gitlab.com/nachee1325/todoprv
Python | 213 lines | 194 code | 8 blank | 11 comment | 56 complexity | b695963dd224d53af7a8c5f84e8bcd30 MD5 | raw file
  1. """A more or less complete user-defined wrapper around dictionary objects."""
  2. class UserDict:
  3. def __init__(*args, **kwargs):
  4. if not args:
  5. raise TypeError("descriptor '__init__' of 'UserDict' object "
  6. "needs an argument")
  7. self = args[0]
  8. args = args[1:]
  9. if len(args) > 1:
  10. raise TypeError('expected at most 1 arguments, got %d' % len(args))
  11. if args:
  12. dict = args[0]
  13. elif 'dict' in kwargs:
  14. dict = kwargs.pop('dict')
  15. import warnings
  16. warnings.warn("Passing 'dict' as keyword argument is "
  17. "deprecated", PendingDeprecationWarning,
  18. stacklevel=2)
  19. else:
  20. dict = None
  21. self.data = {}
  22. if dict is not None:
  23. self.update(dict)
  24. if len(kwargs):
  25. self.update(kwargs)
  26. def __repr__(self): return repr(self.data)
  27. def __cmp__(self, dict):
  28. if isinstance(dict, UserDict):
  29. return cmp(self.data, dict.data)
  30. else:
  31. return cmp(self.data, dict)
  32. __hash__ = None # Avoid Py3k warning
  33. def __len__(self): return len(self.data)
  34. def __getitem__(self, key):
  35. if key in self.data:
  36. return self.data[key]
  37. if hasattr(self.__class__, "__missing__"):
  38. return self.__class__.__missing__(self, key)
  39. raise KeyError(key)
  40. def __setitem__(self, key, item): self.data[key] = item
  41. def __delitem__(self, key): del self.data[key]
  42. def clear(self): self.data.clear()
  43. def copy(self):
  44. if self.__class__ is UserDict:
  45. return UserDict(self.data.copy())
  46. import copy
  47. data = self.data
  48. try:
  49. self.data = {}
  50. c = copy.copy(self)
  51. finally:
  52. self.data = data
  53. c.update(self)
  54. return c
  55. def keys(self): return self.data.keys()
  56. def items(self): return self.data.items()
  57. def iteritems(self): return self.data.iteritems()
  58. def iterkeys(self): return self.data.iterkeys()
  59. def itervalues(self): return self.data.itervalues()
  60. def values(self): return self.data.values()
  61. def has_key(self, key): return key in self.data
  62. def update(*args, **kwargs):
  63. if not args:
  64. raise TypeError("descriptor 'update' of 'UserDict' object "
  65. "needs an argument")
  66. self = args[0]
  67. args = args[1:]
  68. if len(args) > 1:
  69. raise TypeError('expected at most 1 arguments, got %d' % len(args))
  70. if args:
  71. dict = args[0]
  72. elif 'dict' in kwargs:
  73. dict = kwargs.pop('dict')
  74. import warnings
  75. warnings.warn("Passing 'dict' as keyword argument is deprecated",
  76. PendingDeprecationWarning, stacklevel=2)
  77. else:
  78. dict = None
  79. if dict is None:
  80. pass
  81. elif isinstance(dict, UserDict):
  82. self.data.update(dict.data)
  83. elif isinstance(dict, type({})) or not hasattr(dict, 'items'):
  84. self.data.update(dict)
  85. else:
  86. for k, v in dict.items():
  87. self[k] = v
  88. if len(kwargs):
  89. self.data.update(kwargs)
  90. def get(self, key, failobj=None):
  91. if key not in self:
  92. return failobj
  93. return self[key]
  94. def setdefault(self, key, failobj=None):
  95. if key not in self:
  96. self[key] = failobj
  97. return self[key]
  98. def pop(self, key, *args):
  99. return self.data.pop(key, *args)
  100. def popitem(self):
  101. return self.data.popitem()
  102. def __contains__(self, key):
  103. return key in self.data
  104. @classmethod
  105. def fromkeys(cls, iterable, value=None):
  106. d = cls()
  107. for key in iterable:
  108. d[key] = value
  109. return d
  110. class IterableUserDict(UserDict):
  111. def __iter__(self):
  112. return iter(self.data)
  113. import _abcoll
  114. _abcoll.MutableMapping.register(IterableUserDict)
  115. class DictMixin:
  116. # Mixin defining all dictionary methods for classes that already have
  117. # a minimum dictionary interface including getitem, setitem, delitem,
  118. # and keys. Without knowledge of the subclass constructor, the mixin
  119. # does not define __init__() or copy(). In addition to the four base
  120. # methods, progressively more efficiency comes with defining
  121. # __contains__(), __iter__(), and iteritems().
  122. # second level definitions support higher levels
  123. def __iter__(self):
  124. for k in self.keys():
  125. yield k
  126. def has_key(self, key):
  127. try:
  128. self[key]
  129. except KeyError:
  130. return False
  131. return True
  132. def __contains__(self, key):
  133. return self.has_key(key)
  134. # third level takes advantage of second level definitions
  135. def iteritems(self):
  136. for k in self:
  137. yield (k, self[k])
  138. def iterkeys(self):
  139. return self.__iter__()
  140. # fourth level uses definitions from lower levels
  141. def itervalues(self):
  142. for _, v in self.iteritems():
  143. yield v
  144. def values(self):
  145. return [v for _, v in self.iteritems()]
  146. def items(self):
  147. return list(self.iteritems())
  148. def clear(self):
  149. for key in self.keys():
  150. del self[key]
  151. def setdefault(self, key, default=None):
  152. try:
  153. return self[key]
  154. except KeyError:
  155. self[key] = default
  156. return default
  157. def pop(self, key, *args):
  158. if len(args) > 1:
  159. raise TypeError, "pop expected at most 2 arguments, got "\
  160. + repr(1 + len(args))
  161. try:
  162. value = self[key]
  163. except KeyError:
  164. if args:
  165. return args[0]
  166. raise
  167. del self[key]
  168. return value
  169. def popitem(self):
  170. try:
  171. k, v = self.iteritems().next()
  172. except StopIteration:
  173. raise KeyError, 'container is empty'
  174. del self[k]
  175. return (k, v)
  176. def update(self, other=None, **kwargs):
  177. # Make progressively weaker assumptions about "other"
  178. if other is None:
  179. pass
  180. elif hasattr(other, 'iteritems'): # iteritems saves memory and lookups
  181. for k, v in other.iteritems():
  182. self[k] = v
  183. elif hasattr(other, 'keys'):
  184. for k in other.keys():
  185. self[k] = other[k]
  186. else:
  187. for k, v in other:
  188. self[k] = v
  189. if kwargs:
  190. self.update(kwargs)
  191. def get(self, key, default=None):
  192. try:
  193. return self[key]
  194. except KeyError:
  195. return default
  196. def __repr__(self):
  197. return repr(dict(self.iteritems()))
  198. def __cmp__(self, other):
  199. if other is None:
  200. return 1
  201. if isinstance(other, DictMixin):
  202. other = dict(other.iteritems())
  203. return cmp(dict(self.iteritems()), other)
  204. def __len__(self):
  205. return len(self.keys())