Когда я отлаживаю Python с помощью IPython, я иногда попадаю в точку прерывания, и я хочу изучить переменную, которая в настоящее время является генератором. Самый простой способ сделать это - преобразовать его в список, но я не понимаю, что это простой способ сделать это в одной строке в ipdb
, так как я настолько новичок в Python.
Преобразование объекта генератора в список для отладки
Ответ 1
Просто вызовите 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 one.
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']