summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2008-09-04 01:42:51 (GMT)
committerBarry Warsaw <barry@python.org>2008-09-04 01:42:51 (GMT)
commitecaab837b6ef36edf1840afdba1fbab747c049d7 (patch)
tree948112c5a3f7dc5e1ee7bc8b473a737328db96ec
parent6ecc5c19802b994b3b7033953361f6157b4bdd0d (diff)
downloadcpython-ecaab837b6ef36edf1840afdba1fbab747c049d7.zip
cpython-ecaab837b6ef36edf1840afdba1fbab747c049d7.tar.gz
cpython-ecaab837b6ef36edf1840afdba1fbab747c049d7.tar.bz2
Committing the patch in issue 2965, so that weakref dicts have a closer
interface to normal dictionaries. keys(), values() and items() still return iterators instead of views, but that can be fixed later (or not).
-rw-r--r--Doc/library/weakref.rst20
-rw-r--r--Lib/test/test_weakref.py24
-rw-r--r--Lib/weakref.py36
3 files changed, 23 insertions, 57 deletions
diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst
index bffa2ba..3681d81 100644
--- a/Doc/library/weakref.rst
+++ b/Doc/library/weakref.rst
@@ -152,14 +152,9 @@ references that will cause the garbage collector to keep the keys around longer
than needed.
-.. method:: WeakKeyDictionary.iterkeyrefs()
-
- Return an :term:`iterator` that yields the weak references to the keys.
-
-
.. method:: WeakKeyDictionary.keyrefs()
- Return a list of weak references to the keys.
+ Return an :term:`iterator` that yields the weak references to the keys.
.. class:: WeakValueDictionary([dict])
@@ -176,18 +171,13 @@ than needed.
magic" (as a side effect of garbage collection).
:class:`WeakValueDictionary` objects have the following additional methods.
-These method have the same issues as the :meth:`iterkeyrefs` and :meth:`keyrefs`
-methods of :class:`WeakKeyDictionary` objects.
-
-
-.. method:: WeakValueDictionary.itervaluerefs()
-
- Return an :term:`iterator` that yields the weak references to the values.
+These method have the same issues as the and :meth:`keyrefs` method of
+:class:`WeakKeyDictionary` objects.
.. method:: WeakValueDictionary.valuerefs()
- Return a list of weak references to the values.
+ Return an :term:`iterator` that yields the weak references to the values.
.. class:: WeakSet([elements])
@@ -290,7 +280,7 @@ the referent is accessed::
def __init__(self, ob, callback=None, **annotations):
super(ExtendedRef, self).__init__(ob, callback)
self.__counter = 0
- for k, v in annotations.iteritems():
+ for k, v in annotations.items():
setattr(self, k, v)
def __call__(self):
diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py
index 1788ac5..108cd7f 100644
--- a/Lib/test/test_weakref.py
+++ b/Lib/test/test_weakref.py
@@ -790,8 +790,8 @@ class MappingTestCase(TestBase):
self.assertEqual(weakref.getweakrefcount(o), 1)
self.assert_(o is dict[o.arg],
"wrong object returned by weak dict!")
- items1 = dict.items()
- items2 = dict.copy().items()
+ items1 = list(dict.items())
+ items2 = list(dict.copy().items())
items1.sort()
items2.sort()
self.assertEqual(items1, items2,
@@ -856,8 +856,8 @@ class MappingTestCase(TestBase):
# Test iterkeyrefs()
objects2 = list(objects)
- self.assertEqual(len(list(dict.iterkeyrefs())), len(objects))
- for wr in dict.iterkeyrefs():
+ self.assertEqual(len(list(dict.keyrefs())), len(objects))
+ for wr in dict.keyrefs():
ob = wr()
self.assert_(ob in dict)
self.assert_(ob in dict)
@@ -892,28 +892,28 @@ class MappingTestCase(TestBase):
def check_iters(self, dict):
# item iterator:
- items = dict.items()
+ items = list(dict.items())
for item in dict.items():
items.remove(item)
- self.assert_(len(items) == 0, "items() did not touch all items")
+ self.assertFalse(items, "items() did not touch all items")
# key iterator, via __iter__():
keys = list(dict.keys())
for k in dict:
keys.remove(k)
- self.assert_(len(keys) == 0, "__iter__() did not touch all keys")
+ self.assertFalse(keys, "__iter__() did not touch all keys")
# key iterator, via iterkeys():
keys = list(dict.keys())
for k in dict.keys():
keys.remove(k)
- self.assert_(len(keys) == 0, "iterkeys() did not touch all keys")
+ self.assertFalse(keys, "iterkeys() did not touch all keys")
# value iterator:
values = list(dict.values())
for v in dict.values():
values.remove(v)
- self.assert_(len(values) == 0,
+ self.assertFalse(values,
"itervalues() did not touch all values")
def test_make_weak_keyed_dict_from_dict(self):
@@ -1030,7 +1030,7 @@ class MappingTestCase(TestBase):
self.assertEqual(len(d), 2)
del d[o1]
self.assertEqual(len(d), 1)
- self.assertEqual(d.keys(), [o2])
+ self.assertEqual(list(d.keys()), [o2])
def test_weak_valued_delitem(self):
d = weakref.WeakValueDictionary()
@@ -1041,7 +1041,7 @@ class MappingTestCase(TestBase):
self.assertEqual(len(d), 2)
del d['something']
self.assertEqual(len(d), 1)
- self.assert_(d.items() == [('something else', o2)])
+ self.assert_(list(d.items()) == [('something else', o2)])
def test_weak_keyed_bad_delitem(self):
d = weakref.WeakKeyDictionary()
@@ -1082,7 +1082,7 @@ class MappingTestCase(TestBase):
d[o] = o.value
del o # now the only strong references to keys are in objs
# Find the order in which iterkeys sees the keys.
- objs = d.keys()
+ objs = list(d.keys())
# Reverse it, so that the iteration implementation of __delitem__
# has to keep looping to find the first object we delete.
objs.reverse()
diff --git a/Lib/weakref.py b/Lib/weakref.py
index 64d962c..5f672c6 100644
--- a/Lib/weakref.py
+++ b/Lib/weakref.py
@@ -106,13 +106,13 @@ class WeakValueDictionary(collections.MutableMapping):
L.append((key, o))
return L
- def iteritems(self):
+ def items(self):
for wr in self.data.values():
value = wr()
if value is not None:
yield wr.key, value
- def iterkeys(self):
+ def keys(self):
return iter(self.data.keys())
def __iter__(self):
@@ -130,7 +130,7 @@ class WeakValueDictionary(collections.MutableMapping):
"""
return self.data.values()
- def itervalues(self):
+ def values(self):
for wr in self.data.values():
obj = wr()
if obj is not None:
@@ -186,14 +186,6 @@ class WeakValueDictionary(collections.MutableMapping):
"""
return self.data.values()
- def values(self):
- L = []
- for wr in self.data.values():
- o = wr()
- if o is not None:
- L.append(o)
- return L
-
class KeyedRef(ref):
"""Specialized reference that includes a key corresponding to the value.
@@ -270,20 +262,12 @@ class WeakKeyDictionary(collections.MutableMapping):
return wr in self.data
def items(self):
- L = []
- for key, value in self.data.items():
- o = key()
- if o is not None:
- L.append((o, value))
- return L
-
- def iteritems(self):
for wr, value in self.data.items():
key = wr()
if key is not None:
yield key, value
- def iterkeyrefs(self):
+ def keyrefs(self):
"""Return an iterator that yields the weak references to the keys.
The references are not guaranteed to be 'live' at the time
@@ -295,7 +279,7 @@ class WeakKeyDictionary(collections.MutableMapping):
"""
return self.data.keys()
- def iterkeys(self):
+ def keys(self):
for wr in self.data.keys():
obj = wr()
if obj is not None:
@@ -304,7 +288,7 @@ class WeakKeyDictionary(collections.MutableMapping):
def __iter__(self):
return iter(self.keys())
- def itervalues(self):
+ def values(self):
return iter(self.data.values())
def keyrefs(self):
@@ -319,14 +303,6 @@ class WeakKeyDictionary(collections.MutableMapping):
"""
return self.data.keys()
- def keys(self):
- L = []
- for wr in self.data.keys():
- o = wr()
- if o is not None:
- L.append(o)
- return L
-
def popitem(self):
while 1:
key, value = self.data.popitem()