2013-12-18 14 views
10

Do celów dydaktycznych chcę mieć notes IPython, który wyświetla (jako wynik z komórki) kod źródłowy funkcji, ale chcę mieć możliwość odniesienia się do tego w wielu notatnikach. Dlatego chciałbym wyświetlić kod funkcji, podobnie jak przy użyciu magii, ale odpowiednio podświetloną składnię.Jak wyświetlić kod źródłowy funkcji pakietu w notesie IPython

To jest podobne pytanie do this question, ale chcę mieć możliwość zastosowania go do pojedynczej funkcji w pliku, a nie do kompletnego pliku naraz.

Korzystanie sugestię z poprzednim pytaniu I hacked krótkiego kodu, który działa w prostych przypadkach:

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))) 

dwa pytania:

  1. This gist sugeruje, że pokazując całą funkcję można zrobić poprzez zdefiniowanie odpowiednia magia komórki. Czy można zdefiniować odpowiednią magię komórki, aby pokazać tylko jedną funkcję, jak powyżej?
  2. Czy można to zrobić bez importowania całego modułu lub bardziej niezawodnego sposobu wykonania tego?

Odpowiedz

5

1) Magics to tylko prosta funkcja nie jest trudne do zdefiniowania, można rzucić okiem hereCustomizing IPython - Config.ipynb jeśli dobrze pamiętam. wciąż nie jestem pewien, czy warto w tej sprawie określić magię.

2) Zazwyczaj nie. Musisz zaimportować moduł, ponieważ potrzebujemy kodu Live, aby wiedzieć, gdzie jest zdefiniowany.

Ogólnie, znalezienie kodu funkcji nie zawsze jest bardzo łatwe. Na pytonie 3 zawsze można uzyskać dostęp do obiektu kodu, ale w większości przypadków, gdy tylko masz takie funkcje jak funkcja dekorowana lub dynamicznie generowana funkcja, staje się ona trudna. Przypuszczam, że możesz również zainspirować się od psource/ i poprosić ich o zwrócenie informacji zamiast jej stronicowania.

Powiązane problemy