Hoi,
Ik ben een class aan het schrijven die gebruikt kan worden om een iterator zich te laten gedragen als een readonly file object. Een groot gedeelte werkt al, maar ik het lukt me niet om het te laten werken met het 'with statement. Ik weet dat de class daarvoor een __enter__ en een __exit__ functie nodig heeft, maar het lukt me niet om dat te laten werken.
Mijn class:
class IterStreamer(object):
"""
File-like streaming iterator.
"""
def __init__(self, generator):
self.generator = generator
self.iterator = iter(generator)
self.leftover = ''
def __len__(self):
return self.generator.__len__()
def __iter__(self):
return self.iterator
def next(self):
return self.iterator.next()
def read(self, size):
data = self.leftover
count = len(self.leftover)
try:
while count < size:
chunk = self.next()
data += chunk
count += len(chunk)
except StopIteration, e:
self.leftover = ''
return data
if count > size:
self.leftover = data[size:]
return data[:size]
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
return True
Ik krijg dan het volgende:
with testiter(10) as f:
for r in f:
print r
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-27-de69c6c119a9> in <module>()
----> 1 with testiter(10) as f:
2 for r in f:
3 print r
AttributeError: __exit__
Maar er is toch een __exit__ functie??? Wat doe ik fout?