web-dev-qa-db-ja.com

python docstringのクラスメソッドへのリンク

同じクラスの別のメソッドのdocstring内からクラスのメソッドへのリンクを追加したい。リンクはsphinxで、優先的にはSpyderや他のPython IDE'sでも機能するようにしたいです。

いくつかのオプションを試してみて、動作するオプションを1つだけ見つけましたが、面倒です。

_mymodule.py_に次の構造があるとします

_def class MyClass():
    def foo(self):
        print 'foo'
    def bar(self):
        """This method does the same as <link to foo>"""
        print 'foo'
_

_<link to foo>_に対して次のオプションを試しました。

  • :func: `foo`
  • :func: `self.foo`
  • :func: `MyClass.foo`
  • :func: `mymodule.MyClass.foo`

リンクを効果的に生成する唯一のものは:func: `mymodule.MyClass.foo`ですが、リンクはmymodule.MyClass.foo()として表示され、foo()として表示されるリンクが必要ですfoo
上記のオプションのいずれも、Spyderでリンクを作成しません。

ご協力いただきありがとうございます。

62
saroele

Sphinxで機能する解決策は、参照の前に_~_を付けることです。

相互参照構文 のSphinxドキュメントに従って、

コンテンツの先頭に〜を付けると、リンクテキストはターゲットの最後のコンポーネントのみになります。たとえば、:py:meth:_~Queue.Queue.get_はQueue.Queue.getを参照しますが、リンクテキストとしてgetのみを表示します。

答えは次のとおりです。

_class MyClass():
    def foo(self):
        print 'foo'
    def bar(self):
        """This method does the same as :func:`~mymodule.MyClass.foo`"""
        print 'foo'
_

これにより、次のようなhtmlが作成されます。This method does the same as foo()、およびfoo()はリンクです。

ただし、これはSpyderにリンクとして表示されない場合があることに注意してください。

63
saroele

使用できるリンクのテキストを手動で指定する場合:

:func:`my text <mymodule.MyClass.foo>`

詳細については、checkout Cross-referencing Python objects

29
devin_s