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'

Antworten auf die Frage(4)

Ihre Antwort auf die Frage