summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2002-11-15 06:46:14 (GMT)
committerRaymond Hettinger <python@rcn.com>2002-11-15 06:46:14 (GMT)
commit7994716b6bcaeca64f47b7b3ed4e411bb6afc415 (patch)
tree0815d4b85257de2a72984d5c7026dab279b053e7 /Lib
parent3a7f405f5b3388b5ba3cf807100627ae5fbf696f (diff)
downloadcpython-7994716b6bcaeca64f47b7b3ed4e411bb6afc415.zip
cpython-7994716b6bcaeca64f47b7b3ed4e411bb6afc415.tar.gz
cpython-7994716b6bcaeca64f47b7b3ed4e411bb6afc415.tar.bz2
SF patch #520382: Expand shelve.py to have a full dictionary interface
and add a mixin to UserDict.py to make it easier to implement a full dictionary interface.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/UserDict.py64
-rw-r--r--Lib/shelve.py4
2 files changed, 67 insertions, 1 deletions
diff --git a/Lib/UserDict.py b/Lib/UserDict.py
index 91af83c..b6b36b2 100644
--- a/Lib/UserDict.py
+++ b/Lib/UserDict.py
@@ -60,3 +60,67 @@ class UserDict:
class IterableUserDict(UserDict):
def __iter__(self):
return iter(self.data)
+
+class DictMixin:
+ '''Mixin defining all dictionary methods for classes that already have
+ a minimum dictionary interface including getitem, setitem, delitem,
+ and keys '''
+
+ # first level provided by subclass: getitem, setitem, delitem, and keys
+
+ # second level definitions which assume only getitem and keys
+ def has_key(self, key):
+ try:
+ value = self[key]
+ except KeyError:
+ return False
+ return True
+ __contains__ = has_key
+ def __iter__(self):
+ for k in self.keys():
+ yield k
+ def __len__(self):
+ return len(self.keys())
+
+ # third level uses second level instead of first
+ def iteritems(self):
+ for k in self:
+ yield (k, self[k])
+ iterkeys = __iter__
+
+ # fourth level uses second and third levels instead of first
+ def itervalues(self):
+ for _, v in self.iteritems():
+ yield v
+ def values(self):
+ return [self[key] for key in self.keys()]
+ def items(self):
+ return list(self.iteritems())
+ def clear(self):
+ for key in self.keys():
+ del self[key]
+ def setdefault(self, key, default):
+ if key not in self:
+ self[key] = default
+ return default
+ return self[key]
+ def pop(self, key):
+ value = self[key]
+ del self[key]
+ return value
+ def popitem(self):
+ try:
+ k, v = self.iteritems().next()
+ except StopIteration:
+ raise KeyError, 'dictionary is empty'
+ del self[k]
+ return (k, v)
+ def update(self, other):
+ for key in other.keys():
+ self[key] = other[key]
+ def get(self, key, default=None):
+ if key in self:
+ return self[key]
+ return default
+ def __repr__(self):
+ return repr(dict(self.items()))
diff --git a/Lib/shelve.py b/Lib/shelve.py
index ae8df3f..7a318a6 100644
--- a/Lib/shelve.py
+++ b/Lib/shelve.py
@@ -40,9 +40,11 @@ try:
except ImportError:
from StringIO import StringIO
+import UserDict
+
__all__ = ["Shelf","BsdDbShelf","DbfilenameShelf","open"]
-class Shelf:
+class Shelf(UserDict.DictMixin):
"""Base class for shelf implementations.
This is initialized with a dictionary-like object.