2012-12-17 8 views
11

Ipython 0.13.1 può stampare l'origine di un oggetto dalla libreria python,
come, os.path.abspath ??
Ma non riesco a stampare il codice sorgente di qualsiasi oggetto che ho definito tramite% ed magic in ipython,
C'è qualcosa che non ho fatto?
come ad esempio, ho definire un nome di classe attraverso la magia% ndr:come stampare il codice sorgente dell'oggetto che ho definito uso% edit magic

%ed 

poi

class Name(object): 
    """docstring for Name""" 
    name = 'hong' 
    def __init__(self, arg): 
     super(Name, self).__init__() 
     self.arg = arg 
    def pri(): 
     print 'class Name' 

quando torna a ipython, non riesco a vedere il codice sorgente della classe Nome:

In [59]: Name?? 
Type:  type 
String Form:<class '__main__.Name'> 
Docstring: docstring for Name 
Constructor information: 
Definition:Name(self, arg) 

È questo l'errore di IPython?

risposta

10

- Le istruzioni dopo OP menzionate si vedono in ipython.

C'è qualche messaggio di errore che si ottiene dopo aver digitato% ed myfunc? Incollare ciò potrebbe aiutare gli altri a trovare il problema.

--- aggiornamento:

Ho anche una versione breve del codice sorgente quando provo Nome ??, ma Name.pri ?? mi fornisce il codice sorgente completo della funzione membro pri() della classe Name. Quindi ipython potrebbe avere qualche convenzione per non fornire il codice sorgente completo delle classi.

Ecco la mia interazione:

versioni
In [2]: Name?? 
    Type:  type 
    String Form:<class '__main__.Name'> 
    Docstring: docstring for Name 
    Constructor information: 
    Definition:Name(self, arg) 

    In [3]: Name.pri?? 
    Type:  instancemethod 
    String Form:<unbound method Name.pri> 
    File:  /tmp/ipython_edit_8YOfN9.py 
    Definition: Name.pri() 
    Source: 
     def pri(): 
      print 'class Name' 

    In [4]: 
+0

non utilizzare notebook, uso solo shell IPython, e intendo il problema nella shell IPython –

+0

ah, scusa per la svista. Ora ho modificato la risposta alla ricerca di messaggi di errore che potrebbero aiutare gli altri a risolverlo. –

+0

Grazie, l'ho ri-editato. –

3

recenti IPython (non sono sicuro l'esatto numero di versione) in realtà fanno mostrare la fonte:

IPython 0.13 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [1]: %ed 
IPython will make a temporary file named: /var/folders/88/zgy_z51x1fn2mp_7vmkj3phm0000gn/T/ipython_edit_g9xYY4.py 
Editing... done. Executing edited code... 
Out[1]: 'def f(a):\n\treturn a + 3\n' 

In [2]: f(4) 
Out[2]: 7 

In [3]: f?? 
Type:  function 
String Form:<function f at 0x18ddb30> 
File:  /var/folders/88/zgy_z51x1fn2mp_7vmkj3phm0000gn/T/ipython_edit_g9xYY4.py 
Definition: f(a) 
Source: 
def f(a): 
     return a + 3 

Ci sono altri due modi per ottenere il fonte. Uno è se puoi tornare alla linea in cui hai chiamato %ed, il valore restituito dovrebbe essere il codice sorgente (qui, questo è Out[1], quindi potresti fare print Out[1]). Un altro è chiamare %ed f - questo dovrebbe caricare la definizione corrente di f nell'editor e consentire di modificare la definizione.

+0

definizione di funzione come il tuo 'def f (a): return a + 3', non ho alcun problema, anche. Puoi definire un oggetto di classe per provare. il mio IPython è v0.13.1. Grazie –

+0

Oh capisco. Interessante. Sì, forse IPython non stampa il codice sorgente per le classi, ma sfortunatamente non ti lascia "% nd" neanche ... – illya

+0

L'ho trovato anch'io. Ma puoi% l'intera classe tramite% ed la funzione della classe, come% ed Name.pri, che ho definito nella domanda sopra. –

Problemi correlati