Преобразование объекта генератора в Список для отладки [дубликат]
этот вопрос уже есть ответ здесь:
- Быстрый способ преобразовать итератор в список 1 ответ
когда я отлаживаю в 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
что будет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']