diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-09-29 20:33:03 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-09-29 20:33:03 (GMT) |
commit | cab4566c5a7bda8e26047d439423aa375ca2e317 (patch) | |
tree | c052d18603d8ca7f204b45374646d2348d0f37a7 /Lib | |
parent | 22afc506fbac63ac1f260dd930ae5064bb045e5f (diff) | |
download | cpython-cab4566c5a7bda8e26047d439423aa375ca2e317.zip cpython-cab4566c5a7bda8e26047d439423aa375ca2e317.tar.gz cpython-cab4566c5a7bda8e26047d439423aa375ca2e317.tar.bz2 |
Issue #22609: Constructor and the update method of collections.UserDict now
accept the self keyword argument.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/UserDict.py | 37 | ||||
-rw-r--r-- | Lib/test/test_userdict.py | 35 |
2 files changed, 69 insertions, 3 deletions
diff --git a/Lib/UserDict.py b/Lib/UserDict.py index bb2218a..732b327 100644 --- a/Lib/UserDict.py +++ b/Lib/UserDict.py @@ -1,7 +1,24 @@ """A more or less complete user-defined wrapper around dictionary objects.""" class UserDict: - def __init__(self, dict=None, **kwargs): + def __init__(*args, **kwargs): + if not args: + raise TypeError("descriptor '__init__' of 'UserDict' object " + "needs an argument") + self = args[0] + args = args[1:] + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + if args: + dict = args[0] + elif 'dict' in kwargs: + dict = kwargs.pop('dict') + import warnings + warnings.warn("Passing 'dict' as keyword argument is " + "deprecated", PendingDeprecationWarning, + stacklevel=2) + else: + dict = None self.data = {} if dict is not None: self.update(dict) @@ -43,7 +60,23 @@ class UserDict: def itervalues(self): return self.data.itervalues() def values(self): return self.data.values() def has_key(self, key): return key in self.data - def update(self, dict=None, **kwargs): + def update(*args, **kwargs): + if not args: + raise TypeError("descriptor 'update' of 'UserDict' object " + "needs an argument") + self = args[0] + args = args[1:] + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + if args: + dict = args[0] + elif 'dict' in kwargs: + dict = kwargs.pop('dict') + import warnings + warnings.warn("Passing 'dict' as keyword argument is deprecated", + PendingDeprecationWarning, stacklevel=2) + else: + dict = None if dict is None: pass elif isinstance(dict, UserDict): diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py index d5cecd8..fa80fea 100644 --- a/Lib/test/test_userdict.py +++ b/Lib/test/test_userdict.py @@ -2,6 +2,7 @@ from test import test_support, mapping_tests import UserDict +import warnings d0 = {} d1 = {"one": 1} @@ -29,7 +30,9 @@ class UserDictTest(mapping_tests.TestHashMappingProtocol): self.assertEqual(UserDict.UserDict(one=1, two=2), d2) # item sequence constructor self.assertEqual(UserDict.UserDict([('one',1), ('two',2)]), d2) - self.assertEqual(UserDict.UserDict(dict=[('one',1), ('two',2)]), d2) + with test_support.check_warnings((".*'dict'.*", + PendingDeprecationWarning)): + self.assertEqual(UserDict.UserDict(dict=[('one',1), ('two',2)]), d2) # both together self.assertEqual(UserDict.UserDict([('one',1), ('two',2)], two=3, three=5), d3) @@ -148,6 +151,36 @@ class UserDictTest(mapping_tests.TestHashMappingProtocol): self.assertEqual(t.popitem(), ("x", 42)) self.assertRaises(KeyError, t.popitem) + def test_init(self): + for kw in 'self', 'other', 'iterable': + self.assertEqual(list(UserDict.UserDict(**{kw: 42}).items()), + [(kw, 42)]) + self.assertEqual(list(UserDict.UserDict({}, dict=42).items()), + [('dict', 42)]) + self.assertEqual(list(UserDict.UserDict({}, dict=None).items()), + [('dict', None)]) + with test_support.check_warnings((".*'dict'.*", + PendingDeprecationWarning)): + self.assertEqual(list(UserDict.UserDict(dict={'a': 42}).items()), + [('a', 42)]) + self.assertRaises(TypeError, UserDict.UserDict, 42) + self.assertRaises(TypeError, UserDict.UserDict, (), ()) + self.assertRaises(TypeError, UserDict.UserDict.__init__) + + def test_update(self): + for kw in 'self', 'other', 'iterable': + d = UserDict.UserDict() + d.update(**{kw: 42}) + self.assertEqual(list(d.items()), [(kw, 42)]) + d = UserDict.UserDict() + with test_support.check_warnings((".*'dict'.*", + PendingDeprecationWarning)): + d.update(dict={'a': 42}) + self.assertEqual(list(d.items()), [('a', 42)]) + self.assertRaises(TypeError, UserDict.UserDict().update, 42) + self.assertRaises(TypeError, UserDict.UserDict().update, {}, {}) + self.assertRaises(TypeError, UserDict.UserDict.update) + def test_missing(self): # Make sure UserDict doesn't have a __missing__ method self.assertEqual(hasattr(UserDict, "__missing__"), False) |