a. Orthographier droite: pas
def __iter(self):
mais:
def __iter__(self):
avec __
avant et après iter
.
b. Faites le bon corps: pas
return 33
mais:
yield 33
ou retour iter ([33])
Si vous return
une valeur de __iter__
, le retour d'un iterator (un itérable, comme dans return [33]
, est presque aussi bon mais pas tout à fait ...); ou sinon, yield
1+ valeurs, ce qui rend __iter__
dans une fonction de générateur (de sorte qu'il renvoie intrinsèquement un itérateur de générateur).
c. Appelez-le droit: pas
a().itervalues()
mais, par exemple .:
for x in a(): print x
ou
print list(a())
itervalues
est une méthode de dict, et n'a rien à voir avec __iter__
.
Si vous corrigez les trois erreurs (!), Le code fonctionne mieux ;-).
Mais si il revient juste 33, est-ce vraiment un itérateur? –
Eh bien, si vous ** cédez ** 33, alors oui, alors la méthode devient une expression génératrice, ce qui donne un itérateur. Quand vous revenez [33], eh bien, une liste est certainement itérable, donc ça marche aussi. – shylent
@Goose et @Shylent, oui: 'yield 33' fait de' __iter__' une fonction de générateur (** pas ** generator_expression_ - c'est une construction différente ;-), donc ça retourne un générateur, qui est un itérateur; 'return [33]' renvoie un itérateur mais pas un itérateur, donc c'est un peu imparfait - édition de réponse pour corriger ce problème! -) –