summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2002-11-27 08:29:11 (GMT)
committerRaymond Hettinger <python@rcn.com>2002-11-27 08:29:11 (GMT)
commite4827eb2a2c9eed8911a6874866a224972ff40ab (patch)
tree5195b5c1ede95d2a8251247a4a52598aaa7ec510
parente33d3df03079d704edbe159be079dc387058f044 (diff)
downloadcpython-e4827eb2a2c9eed8911a6874866a224972ff40ab.zip
cpython-e4827eb2a2c9eed8911a6874866a224972ff40ab.tar.gz
cpython-e4827eb2a2c9eed8911a6874866a224972ff40ab.tar.bz2
Bring UserDict in-sync with changes to dict.
Constructor accepts optional keyword arguments after a optional items list. Add fromkeys() as an alternate constructor from an iterable over keys. Expand related unittests.
-rw-r--r--Lib/UserDict.py18
-rw-r--r--Lib/test/test_userdict.py13
2 files changed, 25 insertions, 6 deletions
diff --git a/Lib/UserDict.py b/Lib/UserDict.py
index 02ddfc4..34ceb3a 100644
--- a/Lib/UserDict.py
+++ b/Lib/UserDict.py
@@ -2,13 +2,13 @@
class UserDict:
def __init__(self, dict=None, **kwargs):
- self.data = kwargs # defaults to {}
+ self.data = {}
if dict is not None:
- if hasattr(dict,'keys'): # handle mapping (possibly a UserDict)
- self.update(dict)
- else: # handle sequence
- DICT = type({}) # because builtin dict is locally overridden
- self.data.update(DICT(dict))
+ if not hasattr(dict,'keys'):
+ dict = type({})(dict) # make mapping from a sequence
+ self.update(dict)
+ if len(kwargs):
+ self.update(kwargs)
def __repr__(self): return repr(self.data)
def __cmp__(self, dict):
if isinstance(dict, UserDict):
@@ -61,6 +61,12 @@ class UserDict:
return self.data.popitem()
def __contains__(self, key):
return key in self.data
+ def fromkeys(cls, iterable, value=None):
+ d = cls()
+ for key in iterable:
+ d[key] = value
+ return d
+ fromkeys = classmethod(fromkeys)
class IterableUserDict(UserDict):
def __iter__(self):
diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py
index b561ac1..e61238f 100644
--- a/Lib/test/test_userdict.py
+++ b/Lib/test/test_userdict.py
@@ -6,6 +6,9 @@ from UserDict import UserDict, IterableUserDict
d0 = {}
d1 = {"one": 1}
d2 = {"one": 1, "two": 2}
+d3 = {"one": 1, "two": 3, "three": 5}
+d4 = {"one": None, "two": None}
+d5 = {"one": 1, "two": 1}
# Test constructors
@@ -21,6 +24,16 @@ uu2 = UserDict(u2)
verify(UserDict(one=1, two=2) == d2) # keyword arg constructor
verify(UserDict([('one',1), ('two',2)]) == d2) # item sequence constructor
+verify(UserDict(dict=[('one',1), ('two',2)]) == d2)
+verify(UserDict([('one',1), ('two',2)], two=3, three=5) == d3) # both together
+
+verify(UserDict.fromkeys('one two'.split()) == d4) # alternate constructor
+verify(UserDict().fromkeys('one two'.split()) == d4)
+verify(UserDict.fromkeys('one two'.split(), 1) == d5)
+verify(UserDict().fromkeys('one two'.split(), 1) == d5)
+verify(u1.fromkeys('one two'.split()) is not u1)
+verify(isinstance(u1.fromkeys('one two'.split()), UserDict))
+verify(isinstance(u2.fromkeys('one two'.split()), IterableUserDict))
# Test __repr__