summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2010-07-11 19:27:06 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2010-07-11 19:27:06 (GMT)
commit16d037653d50a035f106636715095840e4fabe70 (patch)
treecc6659650dce5feafd22660dfc3a69a8699ff331
parentdedbbe6b3bfbf1fda4e333ec80507576c1725544 (diff)
downloadcpython-16d037653d50a035f106636715095840e4fabe70.zip
cpython-16d037653d50a035f106636715095840e4fabe70.tar.gz
cpython-16d037653d50a035f106636715095840e4fabe70.tar.bz2
Merged revisions 82821 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r82821 | mark.dickinson | 2010-07-11 19:53:06 +0100 (Sun, 11 Jul 2010) | 3 lines Issue #9137: Fix issue in MutableMapping.update, which incorrectly treated keyword arguments called 'self' or 'other' specially. ........
-rw-r--r--Lib/_abcoll.py10
-rw-r--r--Lib/test/test_collections.py13
-rw-r--r--Misc/NEWS3
3 files changed, 25 insertions, 1 deletions
diff --git a/Lib/_abcoll.py b/Lib/_abcoll.py
index e9f06a5..cc00fd9 100644
--- a/Lib/_abcoll.py
+++ b/Lib/_abcoll.py
@@ -480,7 +480,15 @@ class MutableMapping(Mapping):
except KeyError:
pass
- def update(self, other=(), **kwds):
+ def update(*args, **kwds):
+ if len(args) > 2:
+ raise TypeError("update() takes at most 2 positional "
+ "arguments ({} given)".format(len(args)))
+ elif not args:
+ raise TypeError("update() takes at least 1 argument (0 given)")
+ self = args[0]
+ other = args[1] if len(args) >= 2 else ()
+
if isinstance(other, Mapping):
for key in other:
self[key] = other[key]
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index 33deb78..85bf248 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -725,6 +725,19 @@ class TestOrderedDict(unittest.TestCase):
od.update([('a', 1), ('b', 2), ('c', 9), ('d', 4)], c=3, e=5)
self.assertEqual(list(od.items()), pairs) # mixed input
+ # Issue 9137: Named argument called 'other' or 'self'
+ # shouldn't be treated specially.
+ od = OrderedDict()
+ od.update(self=23)
+ self.assertEqual(list(od.items()), [('self', 23)])
+ od = OrderedDict()
+ od.update(other={})
+ self.assertEqual(list(od.items()), [('other', {})])
+ od = OrderedDict()
+ od.update(red=5, blue=6, other=7, self=8)
+ self.assertEqual(sorted(list(od.items())),
+ [('blue', 6), ('other', 7), ('red', 5), ('self', 8)])
+
# Make sure that direct calls to update do not clear previous contents
# add that updates items are not moved to the end
d = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 44), ('e', 55)])
diff --git a/Misc/NEWS b/Misc/NEWS
index 7911c4f..601943f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -78,6 +78,9 @@ C-API
Library
-------
+- Issue #9137: Fix issue in MutableMapping.update, which incorrectly
+ treated keyword arguments called 'self' or 'other' specially.
+
- Issue #7646: The fnmatch pattern cache no longer grows without bound.
- Issue #9136: Fix 'dictionary changed size during iteration'