Вопрос по python – Является ли generator.next () видимым в python 3.0?

199

У меня есть генератор, который генерирует серию, например:

def triangleNums():
    '''generate series of triangle numbers'''
    tn = 0
    counter = 1
    while(True):
        tn = tn + counter
        yield tn
        counter = counter + 1

в Python 2.6 я могу сделать следующие вызовы:

g = triangleNums() # get the generator
g.next()           # get next val

однако в 3.0, если я выполняю те же две строки кода, я получаю следующую ошибку:

AttributeError: 'generator' object has no attribute 'next'

но синтаксис итератора цикла работает в 3.0

for n in triangleNums():
    if not exitCond:
       doSomething...

Я пока не смог найти ничего, что объясняло бы эту разницу в поведении для 3.0.

Ваш Ответ

3   ответа
11

Если ваш код должен работать под Python2 и Python3, используйте 2to3шесть библиотека, как это:

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
В этом нет особой необходимости, если только вам не требуется поддержка версий Python более ранних, чем 2.6. Python 2.6 и 2.7 имеютnext встроенная функция.
116

Пытаться:

next(g)

Проверять, выписыватьсяэтот аккуратный стол это показывает различия в синтаксисе между 2 и 3, когда дело доходит до этого.

@MaikuMori я исправил ссылку (жду пересмотра пэром) (сайтdiveintopython3.org кажется внизу Зеркальный сайтdiveintopython3.ep.io все еще жив)
Ссылка все еще битая ...
Исправлена ссылка снова.python3porting.com/differences.html более полным, кстати.
325

Правильный,g.next() был переименован вg.__next__(), Причиной этого является последовательность: специальные методы, такие как__init__() а также__del__ у всех есть двойные подчеркивания (или "больше" в текущем языке), и.next() был одним из немногих исключений из этого правила. Это было исправлено в Python 3.0. [*]

Но вместо того, чтобы звонитьg.__next__(), как говорит Паоло, используйтеnext(g).

[*] Есть другие специальные атрибуты, которые получили это исправление;func_name, сейчас__name__, так далее.

Любая идея, почему Python 2 отказался от соглашения Dunder для этих методов в первую очередь?
Это, вероятно, просто недосмотр.

Похожие вопросы