Est generator.next () visible en python 3.0?
-
21-08-2019 - |
Question
I ai un générateur qui génère une série, par exemple:
def triangleNums():
'''generate series of triangle numbers'''
tn = 0
counter = 1
while(True):
tn = tn + counter
yield tn
counter = counter + 1
en python 2.6 Je suis capable de faire les appels suivants:
g = triangleNums() # get the generator
g.next() # get next val
mais dans la version 3.0 si je Faire la même deux lignes de code que je reçois l'erreur suivante:
AttributeError: 'generator' object has no attribute 'next'
mais la syntaxe boucle de iterator ne fonctionne dans la version 3.0
for n in triangleNums():
if not exitCond:
doSomething...
Je n'ai pas été en mesure de trouver encore rien qui explique cette différence de comportement pour 3.0.
La solution
Corriger, a été renommé g.next()
à g.__next__()
. La raison de cette cohérence: les méthodes spéciales comme et __init__()
ont tous doubles __del__
underscores (ou « Dunder » en langue vernaculaire en cours), et était l'un des .next()
rares exceptions à cette règle. Cela a été corrigé dans Python 3.0. [*]
Mais au lieu d'appeler next(g)
, comme le dit Paolo, utilisez func_name
.
[*] Il existe d'autres attributs spéciaux qui ont obtenu ce correctif; __name__
, est maintenant <=>, etc.
Autres conseils
Essayez:
next(g)
Consultez cette table soignée qui montre les différences de syntaxe entre 2 et 3 en ce qui concerne ce sujet.
Si votre code doit être exécuté sous python2 et python3, utilisez la bibliothèque 2to3 six comme celui-ci :
import six
six.next(g) # on PY2K: 'g.next()' and onPY3K: 'next(g)'