Переход к функции в IPython

Есть ли способ войти в первую строку функции в ipython. Я представляю что-то похожее на:

%step foo(1, 2)

который запускает ipdb и устанавливает точку останова в первой строке foo.

Если я хочу сделать это сейчас, я должен перейти к исходному коду функции и добавить строку import ipdb; ipdb.set_trace().


person Daniel    schedule 28.09.2012    source источник
comment
Нет такой функции, как %step. Вы можете %run -d выполнить весь сценарий, но вы не можете сделать то же самое для одного оператора или вызова функции. Вы можете вручную pdb.run("foo(1, 2)") или pdb.runcall(foo, 1, 2).   -  person abarnert    schedule 29.09.2012
comment
Я как раз сегодня задавался тем же вопросом. Я бы использовал это все время, если бы это было доступно. Пришло время изучить исходный код iPython, чтобы посмотреть, как это можно реализовать.   -  person Daniel Roseman    schedule 29.09.2012
comment
Возможный дубликат Можно ли запускать команды в IPython с отладка?   -  person ivan_pozdeev    schedule 20.09.2017


Ответы (2)


ipdb поддерживает runcall, runeval и run с версии 0.7, ранее в этом году. Вы можете использовать его так же, как pdb.runcall:

In [1]: def foo(a, b):
   ...:     print a + b
   ...:

In [2]: import ipdb

In [3]: ipdb.runcall(foo, 1, 2)
> <ipython-input-1-2e565fd9c4a4>(2)foo()
      1 def foo(a, b):
----> 2     print a + b
      3

ipdb>
person Ian Clelland    schedule 28.09.2012
comment
Это почти то, что мне нужно. Спасибо за указание на обновление 0.7, у меня была старая версия. Имея это, вероятно, легко добавить магию ipython, которая использует runcall. - person Daniel; 29.09.2012
comment
На самом деле получается, что внешний ipdb не нужен, можно просто сделать from IPython.core.debugger import Pdb; ipdb=Pdb(). - person Daniel Roseman; 29.09.2012
comment
Не самый элегантный метод. Я ожидал волшебной функции для такой общей потребности. Интересно, не является ли это обычной потребностью для SciPy пользователей... - person ivan_pozdeev; 15.10.2015