itérer plusieurs fois sur un iterateur
Bonjour,
j'ai une classe MonIter (tirée d'un exemple trouvé sur le web) qui doit me permettre d'itérer sur les n premiers entiers (n étant fournie en argument du constructeur à l'instanciation).
Pour être plus précis, dans mon cas réel, j'ai une classe GribFile (décrivant un certain format de fichier) qui permet d'itérer sur des objets de type GribMessage (correspondant à tous les messages d'un fichier)
J'ai fait une methode __setitem__ dont le but est pour chaque élément de l'itération d'affecter à la clé k la valeur v. J'itère donc sur ces valeurs. Seul problème, quand j'ai fini d'itérer, je ne peux plus réitérer.
J'ai lu des choses sur itertools.tee, mais je ne vois pas comment l'utiliser dans ce cas.
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import print_function
class MonIter():
current=0
def __init__(self,stop):
self.stop=stop
def __iter__(self) :
return self
def __setitem__(self,key,val):
for i in self:
print("si je pouvais sur le message "+str(i)+" je ferais : "+str(i)+"["+str(key)+"]"+str(val))
def next(self) :
self.current+= 1
if self.current>self.stop:
raise StopIteration
if self.current == 5:
print("Quoi déjà 5eme tour?")
return self.current
i1=MonIter(6)
#for i in i1:
# print(i)
i1["truc"]="chose"
for i in i1: # ca marche pas, je suis deja a la fin de l iteration a cause de mon passage dans __setitem__ lors de l'affectation precedente
print(i) |
Quelqu'un peut il m'éclairer ?
Mon objectif est de pouvoir arriver à :
Code:
1 2 3 4 5 6
|
with GribFile(nomfichier) as g:
g[k]=v # Affecte la valeur v aux cles k de chacun des messages contenus dans g
for m in g # Boucle sur les messages
# faire des super choses |
plutôt que :
Code:
1 2 3 4 5 6
|
with GribFile(nomfichier) as g:
for m in g # Boucle sur les messages
m[k]=v
# faire des super choses |
Entre parenthèses je m'en sors très bien avec cette dernière syntaxe mais je préférerais la première (qui devrait faire exactement la même chose au final)
Merci