web-dev-qa-db-ja.com

デバッグ用にジェネレーターオブジェクトをリストに変換する

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

83
Seanny123

ジェネレータで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 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']
143
Jan Vlcinsky