Reputation: 10099
I want to add a link to a method in my class from within the docstring of another method of the same class. I want the link to work in Sphinx and preferentially also in Spyder and other Python IDEs.
I tried several options and found only one that works, but it's cumbersome.
Suppose the following structure in mymodule.py
def class MyClass():
def foo(self):
print 'foo'
def bar(self):
"""This method does the same as <link to foo>"""
print 'foo'
I tried the following options for <link to foo>
:
:func:`foo`
:func:`self.foo`
:func:`MyClass.foo`
:func:`mymodule.MyClass.foo`
The only one that effectively produces a link is :func:`mymodule.MyClass.foo`
, but the link is shown as mymodule.MyClass.foo()
and I want a link that is shown as foo()
or foo
. None of the options above produces a link in Spyder.
Upvotes: 144
Views: 98718
Reputation: 10099
The solution that works for Sphinx is to prefix the reference with ~
.
Per the Sphinx documentation on Cross-referencing Syntax,
If you prefix the content with
~
, the link text will only be the last component of the target. For example,:py:meth:`~Queue.Queue.get`
will refer toQueue.Queue.get
but only displayget
as the link text.
So the answer is:
class MyClass():
def foo(self):
print 'foo'
def bar(self):
"""This method does the same as :func:`~mymodule.MyClass.foo`"""
print 'foo'
This results in an HTML looking like this : This method does the same as foo()
, and foo()
is a link.
However, note that this may not display in Spyder as a link.
Upvotes: 150
Reputation: 3405
If you want to manually specify the text of the link you can use:
:func:`my text <mymodule.MyClass.foo>`
For more information, checkout Cross-referencing Python objects.
Upvotes: 59
Reputation: 27575
It seems to me that you just have to add __name__
or __doc__
to your expression to obtain what you want.
I'm still not sure to have correctly understood the aim
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__
result
<unbound method MyClass.foo>
foo
I am the docstring of foo
<function foo at 0x011C27B0>
foo
I am the docstring of foo
Upvotes: -9