]> granicus.if.org Git - python/commitdiff
Issue #22958: Constructor and update method of weakref.WeakValueDictionary
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 29 Sep 2015 20:52:09 +0000 (23:52 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 29 Sep 2015 20:52:09 +0000 (23:52 +0300)
now accept the self and the dict keyword arguments.

Lib/test/test_weakref.py
Lib/weakref.py
Misc/NEWS

index 3e7347cf335f439a222e1886d4792928c3aba735..212cf340f481f2ec3cf7360caf2e3a9f6db39870 100644 (file)
@@ -1408,6 +1408,18 @@ class MappingTestCase(TestBase):
         dict2 = weakref.WeakValueDictionary(dict)
         self.assertEqual(dict[364], o)
 
+    def test_make_weak_valued_dict_misc(self):
+        # errors
+        self.assertRaises(TypeError, weakref.WeakValueDictionary.__init__)
+        self.assertRaises(TypeError, weakref.WeakValueDictionary, {}, {})
+        self.assertRaises(TypeError, weakref.WeakValueDictionary, (), ())
+        # special keyword arguments
+        o = Object(3)
+        for kw in 'self', 'dict', 'other', 'iterable':
+            d = weakref.WeakValueDictionary(**{kw: o})
+            self.assertEqual(list(d.keys()), [kw])
+            self.assertEqual(d[kw], o)
+
     def make_weak_valued_dict(self):
         dict = weakref.WeakValueDictionary()
         objects = list(map(Object, range(self.COUNT)))
@@ -1488,6 +1500,19 @@ class MappingTestCase(TestBase):
     def test_weak_valued_dict_update(self):
         self.check_update(weakref.WeakValueDictionary,
                           {1: C(), 'a': C(), C(): C()})
+        # errors
+        self.assertRaises(TypeError, weakref.WeakValueDictionary.update)
+        d = weakref.WeakValueDictionary()
+        self.assertRaises(TypeError, d.update, {}, {})
+        self.assertRaises(TypeError, d.update, (), ())
+        self.assertEqual(list(d.keys()), [])
+        # special keyword arguments
+        o = Object(3)
+        for kw in 'self', 'dict', 'other', 'iterable':
+            d = weakref.WeakValueDictionary()
+            d.update(**{kw: o})
+            self.assertEqual(list(d.keys()), [kw])
+            self.assertEqual(d[kw], o)
 
     def test_weak_keyed_dict_update(self):
         self.check_update(weakref.WeakKeyDictionary,
index 12bf9754c52e4ddd7e02e8906950192464e8bf56..5d094971551415d7fdc3ef31c8ba21c50e875ffc 100644 (file)
@@ -98,7 +98,13 @@ class WeakValueDictionary(collections.MutableMapping):
     # objects are unwrapped on the way out, and we always wrap on the
     # way in).
 
-    def __init__(self, *args, **kw):
+    def __init__(*args, **kw):
+        if not args:
+            raise TypeError("descriptor '__init__' of 'WeakValueDictionary' "
+                            "object needs an argument")
+        self, *args = args
+        if len(args) > 1:
+            raise TypeError('expected at most 1 arguments, got %d' % len(args))
         def remove(wr, selfref=ref(self)):
             self = selfref()
             if self is not None:
@@ -252,7 +258,14 @@ class WeakValueDictionary(collections.MutableMapping):
         else:
             return wr()
 
-    def update(self, dict=None, **kwargs):
+    def update(*args, **kwargs):
+        if not args:
+            raise TypeError("descriptor 'update' of 'WeakValueDictionary' "
+                            "object needs an argument")
+        self, *args = args
+        if len(args) > 1:
+            raise TypeError('expected at most 1 arguments, got %d' % len(args))
+        dict = args[0] if args else None
         if self._pending_removals:
             self._commit_removals()
         d = self.data
index 3a9ddda0552a9f7bf0acfcaf7db1f51abb40dbc3..3d5dfa94db0114d73219e0ac8a8c753d9947d87b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -78,6 +78,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #22958: Constructor and update method of weakref.WeakValueDictionary
+  now accept the self and the dict keyword arguments.
+
 - Issue #22609: Constructor of collections.UserDict now accepts the self keyword
   argument.