143

IPython を使用して Python でデバッグしているときに、ブレークポイントにヒットすることがあり、現在ジェネレーターである変数を調べたいと思います。ipdbこれを行う最も簡単な方法は、リストに変換することですが、Python を初めて使用するので、これを 1 行で行う簡単な方法についてはよくわかりません。

4

1 に答える 1

243

listジェネレーターを呼び出すだけです。

lst = list(gen)
lst

これは、それ以上アイテムを返さないジェネレーターに影響することに注意してください。

listコード行をリストするコマンドと競合するため、IPython で直接呼び出すこともできません。

このファイルでテスト:

def gen():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5
import ipdb
ipdb.set_trace()

g1 = gen()

text = "aha" + "bebe"

mylst = range(10, 20)

実行すると:

$ python code.py 
> /home/javl/sandbox/so/debug/code.py(10)<module>()
      9 
---> 10 g1 = gen()
     11 

ipdb> n
> /home/javl/sandbox/so/debug/code.py(12)<module>()
     11 
---> 12 text = "aha" + "bebe"
     13 

ipdb> lst = list(g1)
ipdb> lst
[1, 2, 3, 4, 5]
ipdb> q
Exiting Debugger.

関数/変数/デバッガー名の競合を回避するための一般的な方法

デバッガー コマンドがあり、そのコマンドpとそれに続く任意の式があります。ppprintprettyprint

したがって、次のように使用できます。

$ python code.py 
> /home/javl/sandbox/so/debug/code.py(10)<module>()
      9 
---> 10 g1 = gen()
     11 

ipdb> n
> /home/javl/sandbox/so/debug/code.py(12)<module>()
     11 
---> 12 text = "aha" + "bebe"
     13 

ipdb> p list(g1)
[1, 2, 3, 4, 5]
ipdb> c

exec式の前に を付けて呼び出されるコマンドもあります。これは!、デバッガーに式を Python として強制的に取り込ませます。

ipdb> !list(g1)
[]

詳細についてはhelp phelp ppおよびhelp execデバッガーの場合を参照してください。

ipdb> help exec
(!) statement
Execute the (one-line) statement in the context of
the current stack frame.
The exclamation point can be omitted unless the first word
of the statement resembles a debugger command.
To assign to a global variable you must always prefix the
command with a 'global' command, e.g.:
(Pdb) global list_options; list_options = ['-l']
于 2014-06-09T23:44:25.553 に答える