質問

Iは、例えば、シリーズを生成する発電機を有します

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に私は次のエラーを取得していたコードの同じ2本のラインを実行している場合:

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

しかし、ループイテレータの構文は3.0で動作します。

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

私は3.0のためにこの動作の違いを説明し、まだ何かを見つけることができていませんでした。

役に立ちましたか?

解決

正しい、g.next()g.__next__()に名前が変更されました。この理由の整合性である:__init__()__del__のような特別な方法は全て、二重のアンダースコア(または現在の方言で「dunder」)を持っている、と.next()はそのルールにいくつかの例外の一つでした。これは、Python 3.0で修正されました。 [*]

しかし、その代わりパオロが言うように、g.__next__()を呼び出す、next(g)を使用します。

[*]この修正を得ている他の特別な属性があります。 func_name、今など、__name__されます。

他のヒント

あなたのコードは次のように2to3は 6つののライブラリを使用し、Python2とのpython3の下で実行する必要がある場合:

import six

six.next(g)  # on PY2K: 'g.next()' and onPY3K: 'next(g)'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top