Как показать исходный код функции пакета в записной книжке 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 и вернуть им информацию, а не пейджировать ее.