Skip to content

Commit 101209d

Browse files
committed
Added iterator support to the Weak*Dictionary classes.
1 parent 1031582 commit 101209d

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

Lib/weakref.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ def items(self):
8484
L.append((key, o))
8585
return L
8686

87+
def iteritems(self):
88+
return WeakValuedItemIterator(self)
89+
90+
def iterkeys(self):
91+
return self.data.iterkeys()
92+
__iter__ = iterkeys
93+
94+
def itervalues(self):
95+
return WeakValuedValueIterator(self)
96+
8797
def popitem(self):
8898
while 1:
8999
key, wr = self.data.popitem()
@@ -167,6 +177,16 @@ def items(self):
167177
L.append((o, value))
168178
return L
169179

180+
def iteritems(self):
181+
return WeakKeyedItemIterator(self)
182+
183+
def iterkeys(self):
184+
return WeakKeyedKeyIterator(self)
185+
__iter__ = iterkeys
186+
187+
def itervalues(self):
188+
return self.data.itervalues()
189+
170190
def keys(self):
171191
L = []
172192
for wr in self.data.keys():
@@ -191,5 +211,58 @@ def update(self, dict):
191211
d[ref(key, self._remove)] = value
192212

193213

214+
class BaseIter:
215+
def __iter__(self):
216+
return self
217+
218+
219+
class WeakKeyedKeyIterator(BaseIter):
220+
def __init__(self, weakdict):
221+
self._next = weakdict.data.iterkeys().next
222+
223+
def next(self):
224+
while 1:
225+
wr = self._next()
226+
obj = wr()
227+
if obj is not None:
228+
return obj
229+
230+
231+
class WeakKeyedItemIterator(BaseIter):
232+
def __init__(self, weakdict):
233+
self._next = weakdict.data.iteritems().next
234+
235+
def next(self):
236+
while 1:
237+
wr, value = self._next()
238+
key = wr()
239+
if key is not None:
240+
return key, value
241+
242+
243+
class WeakValuedValueIterator(BaseIter):
244+
def __init__(self, weakdict):
245+
self._next = weakdict.data.itervalues().next
246+
247+
def next(self):
248+
while 1:
249+
wr = self._next()
250+
obj = wr()
251+
if obj is not None:
252+
return obj
253+
254+
255+
class WeakValuedItemIterator(BaseIter):
256+
def __init__(self, weakdict):
257+
self._next = weakdict.data.iteritems().next
258+
259+
def next(self):
260+
while 1:
261+
key, wr = self._next()
262+
value = wr()
263+
if value is not None:
264+
return key, value
265+
266+
194267
# no longer needed
195268
del UserDict

0 commit comments

Comments
 (0)