@@ -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
195268del UserDict
0 commit comments