2013-12-18 3 views
10

В целях обучения я хочу, чтобы ноутбук IPython отображал (как вывод из ячейки) исходный код функции, но я хочу иметь возможность ссылаться на него в нескольких ноутбуках. Поэтому я хотел бы отобразить код функции, аналогично использованию магии % psource, но соответствующий синтаксис выделен.Как показать исходный код функции пакета в записной книжке IPython

Это аналогичный вопрос this question, но я хочу иметь возможность применить его к одной функции внутри файла, а не к полному файлу за один раз.

Используя предложение из предыдущего вопроса я взломал короткий код, который работает в простых случаях:

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

два вопроса:

  1. This gist предполагает, что показывает всю функцию можно было бы сделать, определив соответствующая клеточная магия. Можно ли определить подходящую клеточную магию, чтобы показать только одну функцию, как указано выше?
  2. Есть ли способ сделать это без импорта всего модуля или более надежного способа сделать это?

ответ

5

1) Магики просто просты в использовании, не сложно определить, вы можете посмотреть hereCustomizing IPython - Config.ipynb, если я правильно помню. все же я не уверен, что в вашем случае стоит признать волшебство.

2) В большинстве случаев нет. Вам нужно импортировать модуль, поскольку нам нужен живой код, чтобы узнать, где он определен.

В общем, найти код функции не всегда очень просто. На python 3 вы всегда можете получить доступ к объекту кода, но большую часть времени, как только у вас есть такие вещи, как украшенная функция или динамически сгенерированная функция, становится трудно. Я полагаю, вы также можете вдохновить от psource/ и попросите их вернуть информацию, а не подкачку.

Смежные вопросы