mirror of
https://github.com/python/cpython.git
synced 2025-08-22 17:55:18 +00:00
bpo-36144: Add union operators to WeakKeyDictionary (#19106)
This commit is contained in:
parent
8dd1792c68
commit
25e580a73c
4 changed files with 60 additions and 0 deletions
|
@ -171,6 +171,9 @@ Extension types can easily be made to support weak references; see
|
||||||
performed by the program during iteration may cause items in the
|
performed by the program during iteration may cause items in the
|
||||||
dictionary to vanish "by magic" (as a side effect of garbage collection).
|
dictionary to vanish "by magic" (as a side effect of garbage collection).
|
||||||
|
|
||||||
|
.. versionchanged:: 3.9
|
||||||
|
Added support for ``|`` and ``|=`` operators, specified in :pep:`584`.
|
||||||
|
|
||||||
:class:`WeakKeyDictionary` objects have an additional method that
|
:class:`WeakKeyDictionary` objects have an additional method that
|
||||||
exposes the internal references directly. The references are not guaranteed to
|
exposes the internal references directly. The references are not guaranteed to
|
||||||
be "live" at the time they are used, so the result of calling the references
|
be "live" at the time they are used, so the result of calling the references
|
||||||
|
|
|
@ -1624,6 +1624,43 @@ class MappingTestCase(TestBase):
|
||||||
self.assertEqual(len(d), 1)
|
self.assertEqual(len(d), 1)
|
||||||
self.assertEqual(list(d.keys()), [o2])
|
self.assertEqual(list(d.keys()), [o2])
|
||||||
|
|
||||||
|
def test_weak_keyed_union_operators(self):
|
||||||
|
o1 = C()
|
||||||
|
o2 = C()
|
||||||
|
o3 = C()
|
||||||
|
wkd1 = weakref.WeakKeyDictionary({o1: 1, o2: 2})
|
||||||
|
wkd2 = weakref.WeakKeyDictionary({o3: 3, o1: 4})
|
||||||
|
wkd3 = wkd1.copy()
|
||||||
|
d1 = {o2: '5', o3: '6'}
|
||||||
|
pairs = [(o2, 7), (o3, 8)]
|
||||||
|
|
||||||
|
tmp1 = wkd1 | wkd2 # Between two WeakKeyDictionaries
|
||||||
|
self.assertEqual(dict(tmp1), dict(wkd1) | dict(wkd2))
|
||||||
|
self.assertIs(type(tmp1), weakref.WeakKeyDictionary)
|
||||||
|
wkd1 |= wkd2
|
||||||
|
self.assertEqual(wkd1, tmp1)
|
||||||
|
|
||||||
|
tmp2 = wkd2 | d1 # Between WeakKeyDictionary and mapping
|
||||||
|
self.assertEqual(dict(tmp2), dict(wkd2) | d1)
|
||||||
|
self.assertIs(type(tmp2), weakref.WeakKeyDictionary)
|
||||||
|
wkd2 |= d1
|
||||||
|
self.assertEqual(wkd2, tmp2)
|
||||||
|
|
||||||
|
tmp3 = wkd3.copy() # Between WeakKeyDictionary and iterable key, value
|
||||||
|
tmp3 |= pairs
|
||||||
|
self.assertEqual(dict(tmp3), dict(wkd3) | dict(pairs))
|
||||||
|
self.assertIs(type(tmp3), weakref.WeakKeyDictionary)
|
||||||
|
|
||||||
|
tmp4 = d1 | wkd3 # Testing .__ror__
|
||||||
|
self.assertEqual(dict(tmp4), d1 | dict(wkd3))
|
||||||
|
self.assertIs(type(tmp4), weakref.WeakKeyDictionary)
|
||||||
|
|
||||||
|
del o1
|
||||||
|
self.assertNotIn(4, tmp1.values())
|
||||||
|
self.assertNotIn(4, tmp2.values())
|
||||||
|
self.assertNotIn(1, tmp3.values())
|
||||||
|
self.assertNotIn(1, tmp4.values())
|
||||||
|
|
||||||
def test_weak_valued_delitem(self):
|
def test_weak_valued_delitem(self):
|
||||||
d = weakref.WeakValueDictionary()
|
d = weakref.WeakValueDictionary()
|
||||||
o1 = Object('1')
|
o1 = Object('1')
|
||||||
|
|
|
@ -488,6 +488,25 @@ class WeakKeyDictionary(_collections_abc.MutableMapping):
|
||||||
if len(kwargs):
|
if len(kwargs):
|
||||||
self.update(kwargs)
|
self.update(kwargs)
|
||||||
|
|
||||||
|
def __ior__(self, other):
|
||||||
|
self.update(other)
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __or__(self, other):
|
||||||
|
if isinstance(other, _collections_abc.Mapping):
|
||||||
|
c = self.copy()
|
||||||
|
c.update(other)
|
||||||
|
return c
|
||||||
|
return NotImplemented
|
||||||
|
|
||||||
|
def __ror__(self, other):
|
||||||
|
if isinstance(other, _collections_abc.Mapping):
|
||||||
|
c = self.__class__()
|
||||||
|
c.update(other)
|
||||||
|
c.update(self)
|
||||||
|
return c
|
||||||
|
return NotImplemented
|
||||||
|
|
||||||
|
|
||||||
class finalize:
|
class finalize:
|
||||||
"""Class for finalization of weakrefable objects
|
"""Class for finalization of weakrefable objects
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Added :pep:`584` operators to :class:`weakref.WeakKeyDictionary`.
|
Loading…
Add table
Add a link
Reference in a new issue