Преобразование объекта генератора в список для отладки

Когда я отлаживаю Python с помощью IPython, я иногда ударяю точку прерывания, и я хочу изучить переменную, которая в настоящее время является генератором. Самый простой способ сделать это – преобразовать его в список, но я не понимаю, что это простой способ сделать это в одной строке в ipdb , так как я так новичок в Python.

One Solution collect form web for “Преобразование объекта генератора в список для отладки”

Просто 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. 

Общий метод экранирования имени функции / переменной / отладчика

Существуют команды prettyprint 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, eg: (Pdb) global list_options; list_options = ['-l'] 
Python - лучший язык программирования в мире.