我想从同一类的另一个方法的文档字符串中添加指向我的类中的方法的链接。我希望该链接能够在 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 中显示为链接。
在我看来,你只需在表达式中添加
__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