Входит ли отладчик Python в генераторы? - PullRequest
7 голосов
/ 29 января 2012

В настоящее время я использую IDE NetBeans с Jython 2.5.1

При пошаговой отладке моего проекта, как только встречается итерация по генератору, отладчик переходит прямо к концу кода.Вывод работает нормально, но невозможно выполнить пошаговую отладку после того, как первый генератор встречен.

Является ли это стандартным поведением для отладки Python во всех Python IDE?Разве невозможно отладить код «yield after yield» так же, как мы можем отлаживать VBA для каждого элемента цикла for (извините за упоминание VBA :)?

Спасибо.

РЕДАКТИРОВАТЬ

Без генератора

Код:

def example(n):
i = 1
while i <= n:
    yield i
    i += 1

print "hello"

print "goodbye"

Вывод:

hello
goodbye

Отладка:

[LOG]PythonDebugger : overall Starting
[LOG]PythonDebugger.taskStarted : I am Starting a new Debugging Session ...
[LOG]This window is an interactive debugging context aware Python Shell 
[LOG]where you can enter python console commands while debugging 

(...)

>>>[stdout:]hello
>>>[stdout:]goodbye
Debug session normal end

С генератором

Код:

def example(n):
    i = 1
    while i <= n:
        yield i
        i += 1

print "hello"

for n in example(3):
    print n

print "goodbye"

Вывод:

hello
1
2
3
goodbye

Отладка:

[LOG]PythonDebugger : overall Starting
[LOG]PythonDebugger.taskStarted : I am Starting a new Debugging Session ...
[LOG]This window is an interactive debugging context aware Python Shell 
[LOG]where you can enter python console commands while debugging 

(...)

>>>[stdout:]hello
>>>None['GeneratorExit
deamon ended
']

Debug session normal end

Ответы [ 2 ]

2 голосов
/ 29 января 2012

Я не использую NetBeans, но pdb, по крайней мере, проходит через генераторы. Например:

$ cat test.py
def the_generator():
    for i in xrange(10):
        yield i

for x in the_generator():
    print x

$ python -mpdb test.py
> test.py(1)<module>()
-> def the_generator():
(Pdb) n
> test.py(5)<module>()
-> for x in the_generator():
(Pdb) s
--Call--
> test.py(1)the_generator()
-> def the_generator():
(Pdb) n
> test.py(2)the_generator()
-> for i in xrange(10):
(Pdb) n
> test.py(3)the_generator()
-> yield i
(Pdb) n
--Return--
> test.py(3)the_generator()->0
-> yield i
(Pdb) n
> test.py(6)<module>()
-> print x
(Pdb) n
0

Если вы разместите некоторый код, мы можем попытаться выяснить, что именно происходит в вашем случае.

1 голос
/ 29 января 2012

Я только что протестировал Eclipse, и он будет выполнять отладку с pydev .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...