Ссылка на метод класса в строке документации Python

87

Я хочу добавить ссылку на метод в моем классе из строки документации другого метода того же класса. Я хочу, чтобы ссылка работала в sphinx и предпочтительно также в Spyder и других IDE Python.

Я пробовал несколько вариантов и нашел только один, который работает, но он громоздкий.

Предположим следующую структуру в 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
Я заменил hyperlinkна, linkчтобы избежать путаницы.
saroele
Я все еще не очень хорошо понимаю ваш вопрос. Вы имеете в виду, что хотите выполнить из Sphinx, Spyder или других IDE Python запрос строки документации функции bar, которая даст информацию «функция или метод, который вы ищете, - это foo» ?
eyquem
Во-вторых, какая разница между mymodule.MyClass.foo()и foo()? А что вы называете «дисплеем» ? Это отображение строки? Или вы хотите вернуть объект? В этом последнем случае paens в конце mymodule.MyClass.foo()и foo()слишком много.
eyquem
Извините за путаницу, всегда сложно дать лаконичный ответ на вопрос. Я просто хочу иметь ссылку, по которой вы можете щелкнуть, которая приведет вас к строке документации foo () (в окне документации IDE или в html-сборке Sphinx). Что касается круглых скобок: они верны:: func: mymodule.MyClass.fooпривело к тому, что ссылка была заключена в круглые скобки. И я еще раз немного перефразировал вопрос.
saroele

Ответы:

88

Решение, которое работает для Sphinx, - это добавить к ссылке префикс ~.

Согласно документации Sphinx по синтаксису перекрестных ссылок ,

Если вы поставите перед содержимым префикс ~, текст ссылки будет только последним компонентом цели. Например ~Queue.Queue.get,: py: meth: будет ссылаться на 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 ) @saroele Я планирую исправить эту ситуацию в будущем. Я полностью согласен, было бы здорово иметь это;)
Карлос Кордоба
Это действительно здорово, с нетерпением жду этого. Спасибо за всю вашу работу над Spyder!
saroele
Вы можете сделать это с :any:ролью - см. Примечание о default_setting.
naught101
1
Можно ли сделать перекрестную ссылку без использования полного пути к модулю?
Джонатан
2
Вместо этого :func:я обнаружил, что это должно быть :meth:.
Leo Fang
37

Если вы хотите вручную указать текст ссылки, вы можете использовать:

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

Для получения дополнительной информации см. Перекрестные ссылки на объекты Python .

devin_s
источник
Это работает, спасибо. Посмотрев ссылку, я обнаружил, что префикс ссылки ~ближе к тому, что мне нужно. Я выделил это в отдельном ответе. Однако в Spyder это все еще не работает ...
сароэле
-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
Eyquem
источник
1
Я думаю, вы упустили суть вопроса: я хочу иметь ссылку (гиперссылку) в html моей документации, созданной Sphinx.
saroele
Вы правы, я упускаю главное. И это потому, что я не знаю Сфинкса. поэтому я попытался установить Sphinx. Но мне это не удалось. Я нахожусь в Windows, и я попытался использовать sphinx-quickstart, как сказано в документе. Но я думаю, что неправильно понимаю процесс инсталляции. Я не могу тебе помочь, извини. Я не знаю, что следует понимать под «гиперссылкой» в контексте Sphinx.
eyquem