IPython を使用して Python でデバッグしているときに、ブレークポイントにヒットすることがあり、現在ジェネレーターである変数を調べたいと思います。ipdb
これを行う最も簡単な方法は、リストに変換することですが、Python を初めて使用するので、これを 1 行で行う簡単な方法についてはよくわかりません。
193184 次
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
とそれに続く任意の式があります。pp
print
prettyprint
したがって、次のように使用できます。
$ 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 p
、help 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 に答える