11

教育目的で、関数のソース コードを (セルからの出力として) 表示する 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)))

2 つの質問:

  1. この要点は、適切なセルマジックを定義することで関数全体を表示できることを示唆しています。上記のように、適切なセル マジックを定義して単一の関数だけを表示することは可能ですか?
  2. モジュール全体をインポートせずにこれを行う方法、またはこれを行うより堅牢な方法はありますか?
4

1 に答える 1

5

1) 魔法は単純な関数であり、定義するのは難しくありません。私の記憶が正しければ、こちらを参照してください。 Customizing IPython - Config.ipynbそれでも、あなたのケースで魔法を定義する価値があるかどうかはわかりません。

2) ほとんどの場合、いいえ。モジュールが定義されている場所を知るためにライブコードが必要なため、モジュールをインポートする必要があります。

一般に、関数のコードを見つけることは必ずしも簡単ではありません。Python 3 ではいつでもコード オブジェクトにアクセスできますが、ほとんどの場合、装飾された関数や動的に生成された関数などがあるとすぐにアクセスが難しくなります。psource/からインスピレーションを得pinfo2て、ページングの代わりに情報を返してもらうこともできると思います。

于 2013-12-18T20:41:46.480 に答える