i've got following wrapper dictionary:
class mydict: def __init__(self): self.container = {} def __setitem__(self, key, value): self.container[key] = value def __getitem__(self, key): return self.container[key] def __iter__(self): return self def next(self): pass dic = mydict() dic['a'] = 1 dic['b'] = 2 key in dic: print key
my problem don't know how implement next
method make mydict
iterable. advice appreciated.
dictionaries not iterator (which can iterated on once). make them iterable, object can produce multiple iterators instead.
drop next
method altogether, , have __iter__
return iterable object each time called. can simple returning iterator self.container
:
def __iter__(self): return iter(self.container)
if must make class iterator, you'll have somehow track current iteration position , raise stopiteration
once reach 'end'. naive implementation store iter(self.container)
object on self
first time __iter__
called:
def __iter__(self): return self def next(self): if not hasattr(self, '_iter'): self._iter = iter(self.container) return next(self._iter)
at point iter(self.container)
object takes care of tracking iteration position you, , raise stopiteration
when end reached. it'll raise exception if underlying dictionary altered (had keys added or deleted) , iteration order has been broken.
another way store in integer position , index list(self.container)
each time, , ignore fact insertion or deletion can alter iteration order of dictionary:
_iter_index = 0 def __iter__(self): return self def next(self): idx = self._iter_index if idx none or idx >= len(self.container): # once reach end, iteration done, end of. self._iter_index = none raise stopiteration() value = list(self.container)[idx] self._iter_index = idx + 1 return value
in both cases object iterator can iterated on once. once reach end, can't restart again.
Comments
Post a Comment