Посилання на метод класу в текстовій документації python


87

Я хочу додати посилання на метод у своєму класі з документації іншого методу того ж класу. Я хочу, щоб посилання працювало у сфінксі, переважно також у Spyder та інших середовищах розробки 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 чи від інших середовищ для розробки 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 dev тут ) @saroele Я планую покращити цю ситуацію в майбутньому. Я цілком згоден, що було б дуже здорово мати його;)
Карлос Кордова

Це справді чудово, з нетерпінням чекаю. Дякуємо за всю вашу роботу над Spyder!
saroele

Ви можете зробити це з :any:роллю - див. Примітку про default_setting.
naught101

1
чи можливо перехресне посилання без використання повного шляху модуля?
Джонатан

2
Замість того :func:, я виявив, що це має бути :meth:.
Leo Fang

37

Якщо ви хочете вручну вказати текст посилання, ви можете використовувати:

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

Для отримання додаткової інформації перевірте перехресне посилання на об’єкти Python .


Це працює, дякую. Переглянувши посилання, я з’ясував, що префікс посилання ~ближче до того, що мені потрібно. Я вказав це в окремій відповіді. Однак у Spyder все ще не працює ...
saroele

-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
Думаю, ви пропустили суть питання: я хочу мати посилання (гіперпосилання) у html моєї документації, побудоване Sphinx.
saroele

Ви маєте рацію, я сумую. І це тому, що я не знаю Сфінкса. тому я спробував встановити Sphinx. Але мені це не вдалося. Я працюю під Windows, і я намагався використовувати сфінкс-швидкий старт, як сказано в документі. Але я думаю, що я неправильно розумію процес інтсаляції. Я не можу вам допомогти, вибачте. Я не знаю, що повинно бути недостатньо хорошим за допомогою "гіперпосилання" в контексті Сфінкса.
eyquem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.