10
votes

Retour d'un itérateur puis lancer l'arrêt

Quelle serait la bonne façon de retourner quelque chose d'un itérateur une dernière fois quand il est épuisé. J'utilise un drapeau, mais c'est plutôt laid: xxx

arrière-plan: je récupère une quantité inconnue de chaînes d'une source externe et envoyez-les plus bas à l'appelant. Lorsque le processus est terminé, je veux émettre une chaîne "X enregistrements traités". Je n'ai aucun contrôle sur le code d'appel, cela doit donc être fait à l'intérieur de mon itérateur.


0 commentaires

4 Réponses :


6
votes

Peut-être que vous pouvez utiliser une fonction de générateur à la place:

def example():
    lst = [1, 2, 3]
    while lst:
        yield lst.pop()
    yield 'one last time'


2 commentaires

N'oubliez pas que vous pouvez faire une méthode __ d'un objet est une fonction de générateur elle-même, dans les cas où vous ne pouvez pas ou ne souhaite pas utiliser un générateur directement.


Merci, "rendement" est ce que j'ai manqué.



0
votes

Vous pouvez faire quelque chose comme ceci: xxx

dans votre code réel, vous devrez probablement modifier le type d'exception que vous attrapez, mais ce format doit toujours être applicable.


0 commentaires

6
votes

Vous pouvez simplement céder à partir de __ iter __ code> qui la transformerait en une fonction de générateur (vous pouvez alargiment que vous pouvez simplement écrire une fonction de générateur comme suggéré par Dan). Tout comme un avertissement, cela pourrait être trompeur aux personnes qui abusent la méthode code> suivante suivante.

class Example():

    def __iter__(self):
        lst = [1,2,3]
        for i in reversed(lst):
            yield i
        yield "one last time"


0 commentaires

1
votes

Ne retournez pas une chose supplémentaire. C'est une mauvaise idée parce que cela ne va pas bien. Et si vous voulez faire une somme aussi bien que compter? Ou hachage aussi bien que compter? Un itérateur est un objet stipé. Utilisez cela.

my_iter= iter(Example())
for item in my_iterprin:
    print( item )

print( my_iter.count )


2 commentaires

Je ne peux pas faire cela parce que je ne contrôle pas le code d'appel (c'est une application WSGI).


Je ne contrôle pas le code d'appel? C'est rarement vrai. Appelez-les au téléphone et parlez-leur.