1. ホーム
  2. python

[解決済み] Python の docstring にあるクラスメソッドへのリンク

2022-10-20 06:11:26

質問

私は、同じクラスの別のメソッドのdocstring内から私のクラスのメソッドへのリンクを追加したいです。私はリンクがsphinxと優先的にSpyderと他のPython IDEで動作するようにしたいです。

私はいくつかのオプションを試して、動作する唯一のものを見つけましたが、それは面倒です。

に以下のような構造があるとします。 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でリンクを生成しません。

ご協力ありがとうございました。

どのように解決するのですか?

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ではリンクとして表示されない場合がありますので、ご注意ください。