]> granicus.if.org Git - python/commitdiff
Merged revisions 82821 via svnmerge from
authorMark Dickinson <dickinsm@gmail.com>
Sun, 11 Jul 2010 19:27:06 +0000 (19:27 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sun, 11 Jul 2010 19:27:06 +0000 (19:27 +0000)
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.
........

Lib/_abcoll.py
Lib/test/test_collections.py
Misc/NEWS

index e9f06a5ed370bf867b3fcbed0e60ab14ce9fc34c..cc00fd9b5d5163ccf4a1d675342cff2f3812fd16 100644 (file)
@@ -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]
index 33deb78ff2fb6d22fd6ecf1d5620df93b2e7d0b4..85bf248a0ca4cd70e543635641c4e2812038ff23 100644 (file)
@@ -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)])
index 7911c4fbcc12547bbe2c282c8ffe44374cc5cf0a..601943faf834bf84f64f58ab0dbaf36ab246ef84 100644 (file)
--- 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'