問題

私はこのように定義されたジェネレータを持っています:

 def lengths(x):
    for k, v in x.items():
        yield v['time_length']
 

それは動作し、

 for i in lengths(x):
    print i
 

生成する:

 3600
1200
3600
300
 

正しい数字です。

しかし、私がそれを次のように呼び出すと、

 somefun(lengths(x))
 

ここで、somefun()は次のように定義されます。

 def somefun(lengths):
    for length in lengths():  # <--- ERROR HERE
        if not is_blahblah(length): return False
 

私はこのエラーメッセージが表示されます:

 TypeError: 'generator' object is not callable
 

私は何を誤解していますか?

  ベストアンサー

ジェネレータを呼び出す必要はありません。 () ブラケットを取り除きます。

おそらく、関数内の変数と同じ名前をジェネレータの名前として使用することで混乱しているでしょう。以下も動作します:

 def somefun(lengen):
    for length in lengen:
        if not is_blahblah(length): return False
 

somefun関数に渡されたパラメータは、lengthsの代わりにローカルlengen変数にバインドされ、ローカル変数が他の場所で定義したlengths()関数と同じではないことを明確にします。

  同じタグがついた質問を見る

pythongeneratoryield