0

Windows 7 x64でpydevを使用していますが、ジェネレータ関数内のブレークポイントが無視されることがわかりました(コメントアウトするyieldと、すべて正常に機能しました)。

それから私は古いSOの質問を見つけましたPythonデバッガーはジェネレーターにステップインしますか?

答えは、「Eclipse をテストしたところです。pydev がインストールされた状態でデバッグを行います。」

しかし、コードをテストしたところ、ブレークポイントはまだ無視されています。

def example(n):
    i = 1
    while i <= n:
        yield i
        i += 1

print "hello"

print "goodbye"

if __name__ == '__main__':
    example(8)

だから私の質問は:

  1. PyDev はジェネレーターにステップインできますか?
  2. そうでない場合、そのようなコードをデバッグするにはどうすればよいですか?
4

1 に答える 1

5

古い質問の「ジェネレーターを使用」セクションのコード (質問にあるものではない) をデバッガーで正確に実行し、i += 1ステートメントにブレークポイントを設定すると、そこで実行が停止し、引き続き実行されます。発電機が使い果たされるまで F8 を押して再開します。私はEclipse 2.8.2.2013090511にPyDevを使用しています。

問題は、コードがジェネレーター関数を 1 回だけ呼び出し、イテレーター オブジェクトを返すだけであることです。関数内のコードは実際には実行されません。そのためには、返されたオブジェクトをなんらかの方法で繰り返す必要があります。ステートメントを介して暗黙的に、またはそのメソッドforを呼び出して明示的に。ドキュメントの「ジェネレーターnext」セクションにある「ジェネレーター関数を呼び出すと、値が 1 つも返されない…」で始まる段落を参照してください。

使用したコードは次のとおりです。

def example(n):
    i = 1
    while i <= n:
        yield i
        i += 1

print("hello")

for n in example(3):
    print(n)

print("goodbye")
于 2013-10-20T11:56:48.817 に答える