Pythondocstringのクラスメソッドへのリンク


90

同じクラスの別のメソッドのdocstring内から、クラスのメソッドへのリンクを追加したいと思います。リンクをsphinxで機能させ、優先的にSpyderやその他のPythonIDEでも機能させたい。

私はいくつかのオプションを試し、うまくいくものを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でリンクを生成しません。

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


「内部から...を追加するとはどういう意味ですか?リンクとハイパーリンクの違いは何ですか?
eyquem 2014年

混乱を避けるために置き換えましhyperlinklink
saroele 2014年

私はまだあなたの質問をよく理解していません。Sphinx、Spyder、または他のPython IDEから、「検索する関数またはメソッドはfooです」というbar情報を提供する関数のdocstringの問い合わせを実行することを意味しますか?
eyquem 2014年

第二に、mymodule.MyClass.foo()との間でどのような違いがありますfoo()か?そして、あなたは「ディスプレイ」を何と呼びますか?文字列の表示ですか?または、オブジェクトを返しますか?この後者の場合には、の終わりにpaensmymodule.MyClass.foo()foo()あまりにも多くのです。
eyquem 2014年

混乱して申し訳ありませんが、質問を簡潔に説明することは常に困難です。クリックできるリンクが欲しいだけです。これにより、foo()のドキュメント文字列(IDEのドキュメントウィンドウまたはSphinxのhtmlビルド)に移動します。括弧に関して:それらは正しいです:: func:mymodule.MyClass.foo結果として括弧を持つリンクになりました。そして、私は質問を少し言い換えました。
saroele 2014年

回答:


91

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にリンクとして表示されない場合があることに注意してください。


15
Spyder dev here)@saroele将来的にはこの状況を改善する予定です。私はそれを持っていることは本当にクールだと完全に同意します;)
カルロスコルドバ

それは本当に素晴らしいです、それを楽しみにしています。Spyderでのすべての作業に感謝します!
saroele 2014年

あなたは:any:役割でそれを行うことができます-についてのメモを参照してくださいdefault_setting
naught101 2015

1
完全なモジュールパスを使用せずに相互参照することは可能ですか?
ジョナサン

2
の代わりに:func:、である必要があることがわかりました:meth:
レオ牙

38

リンクのテキストを手動で指定する場合は、次を使用できます。

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

詳細については、Pythonオブジェクトの相互参照を確認してください


これはうまくいきます、ありがとう。リンクを見ると、参照の前に付ける方が~必要なものに近いことがわかりました。私はそれを別の答えに入れました。ただし、Spyderではまだ機能しません...
saroele 2014年

-4

必要なものを取得するには、式に__name__または__doc__を追加するだけでよいように思われます。
目的を正しく理解したかどうかはまだわかりません

class MyClass():
    def foo(self):
        """I am the docstring of foo"""
        print 'foo'
    def bar(self):
        """This method does the same as <link to foo>"""
        print 'foo'

print
print MyClass.foo
print MyClass.foo.__name__
print MyClass.foo.__doc__
print
print MyClass.__dict__['foo']
print MyClass.__dict__['foo'].__name__
print MyClass.__dict__['foo'].__doc__

結果

<unbound method MyClass.foo>
foo
I am the docstring of foo

<function foo at 0x011C27B0>
foo
I am the docstring of foo

1
質問の要点を見逃したと思います。Sphinxによって作成されたドキュメントのhtmlにリンク(ハイパーリンク)が必要です。
saroele 2014年

あなたは正しいです、私は要点を逃します。そして、それは私がスフィンクスを知らないからです。だから私はSphinxをインストールしようとしました。しかし、私は成功しませんでした。私はWindowsを使用していて、ドキュメントに記載されているようにsphinx-quickstartを使用しようとしました。しかし、私はインストールプロセスについて誤解していると思います。私はあなたを助けることができません、ごめんなさい。Sphinxのコンテキストで「ハイパーリンク」が何を理解する必要があるのか​​わかりません。
eyquem 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.