Как показать исходный код функции пакета в записной книжке IPython
В целях обучения я хочу, чтобы ноутбук IPython отображал (как вывод из ячейки) исходный код функции, но я хочу иметь возможность ссылаться на него в нескольких ноутбуках. Поэтому я хотел бы отобразить код функции, аналогично использованию магии% psource, но выделен соответствующий синтаксис.
Это аналогичный вопрос этого вопроса, но я хочу иметь возможность применить его к одной функции внутри файла, а не к полному файлу на один раз.
Используя предложение по предыдущему вопросу, я взломал короткий код, который работает в простых случаях:
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
1) Волшебники - это просто простая функция, которую трудно определить, вы могли бы выглядеть здесь Customizing IPython - Config.ipynb
, если я правильно помню. все же я не уверен, что в вашем случае стоит признать волшебство.
2) В большинстве случаев нет. Вам нужно импортировать модуль, поскольку нам нужен живой код, чтобы узнать, где он определен.
В общем, найти код функции не всегда очень просто. На python 3 вы всегда можете получить доступ к объекту кода, но большую часть времени, как только у вас есть такие вещи, как украшенная функция или динамически сгенерированная функция, становится трудно. Я полагаю, вы могли бы также вдохновить от psource
/pinfo2
и вернуть им информацию, а не пейджировать ее.