Iteradores Python - como atribuir dinamicamente self.next dentro de uma nova classe de estilo?
Como parte de algum middleware WSGI, quero escrever uma classe python que envolva um iterador para implementar um método close no iterador.
Isso funciona bem quando eu tento com uma classe de estilo antigo, mas lança um TypeError quando eu tento com uma classe de novo estilo. O que preciso fazer para que isso funcione com uma nova classe de estilo?
Exemplo:
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
Dá a seguinte saída:
1
2
3
Traceback (most recent call last):
...
TypeError: iter() returned non-iterator of type 'IteratorWrapper2'