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.

Était-ce utile?

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)'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top