Commit b5102e35 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #22958: Constructor and update method of weakref.WeakValueDictionary

now accept the self and the dict keyword arguments.
parent 68f5ef22
...@@ -1408,6 +1408,18 @@ class MappingTestCase(TestBase): ...@@ -1408,6 +1408,18 @@ class MappingTestCase(TestBase):
dict2 = weakref.WeakValueDictionary(dict) dict2 = weakref.WeakValueDictionary(dict)
self.assertEqual(dict[364], o) 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): def make_weak_valued_dict(self):
dict = weakref.WeakValueDictionary() dict = weakref.WeakValueDictionary()
objects = list(map(Object, range(self.COUNT))) objects = list(map(Object, range(self.COUNT)))
...@@ -1488,6 +1500,19 @@ class MappingTestCase(TestBase): ...@@ -1488,6 +1500,19 @@ class MappingTestCase(TestBase):
def test_weak_valued_dict_update(self): def test_weak_valued_dict_update(self):
self.check_update(weakref.WeakValueDictionary, self.check_update(weakref.WeakValueDictionary,
{1: C(), 'a': C(), C(): C()}) {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): def test_weak_keyed_dict_update(self):
self.check_update(weakref.WeakKeyDictionary, self.check_update(weakref.WeakKeyDictionary,
......
...@@ -98,7 +98,13 @@ class WeakValueDictionary(collections.MutableMapping): ...@@ -98,7 +98,13 @@ class WeakValueDictionary(collections.MutableMapping):
# objects are unwrapped on the way out, and we always wrap on the # objects are unwrapped on the way out, and we always wrap on the
# way in). # 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)): def remove(wr, selfref=ref(self)):
self = selfref() self = selfref()
if self is not None: if self is not None:
...@@ -252,7 +258,14 @@ class WeakValueDictionary(collections.MutableMapping): ...@@ -252,7 +258,14 @@ class WeakValueDictionary(collections.MutableMapping):
else: else:
return wr() 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: if self._pending_removals:
self._commit_removals() self._commit_removals()
d = self.data d = self.data
......
...@@ -78,6 +78,9 @@ Core and Builtins ...@@ -78,6 +78,9 @@ Core and Builtins
Library 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 - Issue #22609: Constructor of collections.UserDict now accepts the self keyword
argument. argument.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment