Index: Lib/_abcoll.py =================================================================== --- Lib/_abcoll.py (revision 82435) +++ Lib/_abcoll.py (working copy) @@ -480,7 +480,18 @@ 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] + try: + other = args[1] + except IndexError: + other = () + if isinstance(other, Mapping): for key in other: self[key] = other[key] Index: Lib/test/test_collections.py =================================================================== --- Lib/test/test_collections.py (revision 82435) +++ Lib/test/test_collections.py (working copy) @@ -758,6 +758,19 @@ 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)])