Итераторы Python - как динамически назначать self.next в новом классе стилей?
Как часть некоторого промежуточного программного обеспечения WSGI, я хочу написать класс Python, который обертывает итератор для реализации метода close на итераторе.
Это прекрасно работает, когда я пытаюсь сделать это с классом старого стиля, но выдает ошибку TypeError, когда я пытаюсь сделать это с классом нового стиля. Что мне нужно сделать, чтобы это работало с классом нового стиля?
Пример:
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
Дает следующий вывод:
1
2
3
Traceback (most recent call last):
...
TypeError: iter() returned non-iterator of type 'IteratorWrapper2'