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


этот вопрос уже есть ответ здесь:

  • Быстрый способ преобразовать итератор в список 1 ответ

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

1 72

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']