2012-09-28 17 views
29

C'è un modo per passare alla prima riga di una funzione in ipython. Immagino qualcosa che sarebbe simile:Passaggio a una funzione in IPython

%step foo(1, 2) 

che corre ipdb e imposta un punto di interruzione nella prima riga del foo.

Se voglio farlo ora devo andare al codice sorgente della funzione e aggiungere una riga import ipdb; ipdb.set_trace().

+1

Non c'è alcuna funzione come '% step'. Puoi '% eseguire -d' un intero script, ma non puoi fare la stessa cosa per una singola istruzione o chiamata di funzione. Puoi manualmente 'pdb.run (" pippo (1, 2) ")' o 'pdb.runcall (pippo, 1, 2)'. – abarnert

+0

Mi stavo chiedendo la stessa cosa oggi. Lo userei sempre se fosse disponibile. È ora di scavare nel sorgente iPython per vedere come potrebbe essere implementato. –

+0

Possibile duplicato di [È possibile eseguire comandi in IPython con debugging?] (Https://stackoverflow.com/questions/9689378/is-it-possible-to-run-commands-in-ipython-with-debugging) –

risposta

42

ipdb ha avuto il supporto per runcall, runeval e gestito da 0.7, all'inizio di quest'anno. Puoi utilizzarlo come 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> 
+0

Questo è praticamente ciò di cui ho bisogno. Grazie per aver segnalato l'aggiornamento 0.7, avevo una versione precedente. Avendo che è probabilmente facile aggiungere una magia ipython che usa runcall. –

+8

In realtà risulta che non hai bisogno dell'ipdb esterno, puoi semplicemente fare 'da IPython.core.debugger import Pdb; IPDB = PDB() '. –

+1

Non è il metodo più elegante. Mi aspettavo una funzione magica per un bisogno così comune. Mi chiedo se non sia un bisogno comune degli utenti di 'SciPy' ... –

Problemi correlati