2013-12-18 14 views
10

Per scopi didattici, desidero un notebook IPython che visualizzi (come output da una cella) il codice sorgente della funzione, ma voglio poterlo fare riferimento a più quaderni. Quindi mi piacerebbe visualizzare il codice funzione, in modo simile all'utilizzo della magia %, ma sintassi opportunamente evidenziata.Come mostrare il codice sorgente di una funzione pacchetto nel notebook IPython

Questa è una domanda simile a this question, ma voglio essere in grado di applicarlo a una singola funzione all'interno di un file, piuttosto che al file completo in una volta.

Utilizzando il suggerimento dalla domanda precedente ho inciso un breve codice che funziona nei casi più semplici:

def print_source(module, function): 
    """For use inside an IPython notebook: given a module and a function, print the source code.""" 
    from inspect import getmembers, isfunction, getsource 
    from pygments import highlight 
    from pygments.lexers import PythonLexer 
    from pygments.formatters import HtmlFormatter 
    from IPython.core.display import HTML 

    internal_module = __import__(module) 

    internal_functions = dict(getmembers(internal_module, isfunction)) 

    return HTML(highlight(getsource(internal_functions[function]), PythonLexer(), HtmlFormatter(full=True))) 

Due domande:

  1. This gist suggerisce che che mostra l'intera funzione potrebbe essere fatto mediante la definizione magia cellulare appropriata. È possibile definire una magia di cella appropriata per mostrare solo una singola funzione, come sopra?
  2. C'è un modo per farlo senza importare l'intero modulo o un modo più efficace per farlo?

risposta

5

1) Magics sono solo semplice funzione non è difficile da definire, si potrebbe avere uno sguardo hereCustomizing IPython - Config.ipynb se non ricordo male. tuttavia non sono sicuro che valga la pena di definire una magia nel tuo caso.

2) La maggior parte del tempo, no. Devi importare il modulo perché abbiamo bisogno di codice live per sapere dove è definito.

In generale, trovare il codice di una funzione non è sempre semplicissimo. Su python 3 è sempre possibile accedere all'oggetto codice, ma la maggior parte delle volte, non appena si dispone di funzioni come la funzione decorata o la funzione generata dinamicamente, diventa difficile. Suppongo che potresti anche ispirare da psource/ e farli restituire informazioni invece di cercarlo.

Problemi correlati