IPythonを使用してPythonでデバッグしているときに、ブレークポイントに達することがあり、現在ジェネレーターである変数を調べたい場合があります。私がこれを行うことを考えることができる最も簡単な方法は、それをリストに変換することですが、私はPythonが初めてなので、ipdb
の1行でこれを行う簡単な方法は明確ではありません。
ジェネレータでlist
を呼び出すだけです。
lst = list(gen)
lst
これはジェネレーターに影響することに注意してください。ジェネレーターはそれ以上アイテムを返しません。
また、IPythonでlist
を直接呼び出すことはできません。コードの行を一覧表示するコマンドと競合するためです。
このファイルでテスト済み:
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']