2011-02-18 3 views
0

J'implémente un itérateur en Python qui enveloppe un autre itérateur et post-traite la sortie de l'itérateur avant de la transmettre. Voici un exemple trivial qui prend un itérateur qui renvoie des chaînes et prepends FILTERED BY MYITER: à chacun:Une exception StopIteration se propage-t-elle automatiquement à travers mon itérateur?

class MyIter(object): 
    """A filter for an iterator that returns strings.""" 
    def __init__(self, string_iterator): 
     self.inner_iterator = string_iterator 
    def __iter__(self): 
     return self 
    def next(self): 
     return "FILTERED BY MYITER: " + self.inner_iterator.next() 

Lorsque l'itérateur interne se termine, il déclenche une exception StopIteration. Ai-je besoin de faire quelque chose de spécial pour propager cette exception quel que soit le code utilisé mon itérateur? Ou cela se produira-t-il automatiquement, ce qui entraînera la fin correcte de mon itérateur.

Répondre

1

Vous n'avez rien de spécial à faire - l'exception StopIteration sera propagée automatiquement. En outre - vous pouvez lire sur le mot-clé yield - il simplifie beaucoup la création de générateurs/itérateurs.

+0

Excellent, je viens d'apprendre que je peux utiliser les expressions 'yield' et generator dans la méthode '__iter__' d'une classe. Je n'étais pas sûr de savoir comment les utiliser dans une classe itérable. –

1

Dans ce cas, l'exception StopIteration sera propagée.

1

Que s'est-il passé lorsque vous l'avez essayé? :-)

Mais oui, l'exception StopIteration n'est pas spéciale et se propagera jusqu'à ce que quelque chose les intercepte. La méthode next() ne les piège pas, et self.inner_iterator.next() déclenchera un StopIteration quand il ne restera plus rien à parcourir.

Questions connexes