Python-Iteratoren - Wie kann man self.next in einer neuen Stilklasse dynamisch zuweisen?
Als Teil einer WSGI-Middleware möchte ich eine Python-Klasse schreiben, die einen Iterator umschließt, um eine close-Methode für den Iterator zu implementieren.
Dies funktioniert einwandfrei, wenn ich es mit einer Klasse im alten Stil versuche, löst jedoch einen TypeError aus, wenn ich es mit einer Klasse im neuen Stil versuche. Was muss ich tun, um dies mit einer neuen Klasse zum Laufen zu bringen?
Beispiel:
class IteratorWrapper1:
def __init__(self, otheriter):
self._iterator = otheriter
self.next = otheriter.next
def __iter__(self):
return self
def close(self):
if getattr(self._iterator, 'close', None) is not None:
self._iterator.close()
# other arbitrary resource cleanup code here
class IteratorWrapper2(object):
def __init__(self, otheriter):
self._iterator = otheriter
self.next = otheriter.next
def __iter__(self):
return self
def close(self):
if getattr(self._iterator, 'close', None) is not None:
self._iterator.close()
# other arbitrary resource cleanup code here
if __name__ == "__main__":
for i in IteratorWrapper1(iter([1, 2, 3])):
print i
for j in IteratorWrapper2(iter([1, 2, 3])):
print j
Gibt die folgende Ausgabe aus:
1
2
3
Traceback (most recent call last):
...
TypeError: iter() returned non-iterator of type 'IteratorWrapper2'