web-dev-qa-db-fra.com

Lien vers la méthode de classe dans python docstring

Je veux ajouter un lien vers une méthode de ma classe à partir de la docstring d'une autre méthode de la même classe. Je veux que le lien fonctionne dans sphinx et préférentiellement aussi dans Spyder et autres Python IDE.

J'ai essayé plusieurs options et n'en ai trouvé qu'une seule qui fonctionne, mais c'est encombrant.

Supposons que la structure suivante dans mymodule.py

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

J'ai essayé les options suivantes pour <link to foo>:

  • : func: `foo`
  • : func: `self.foo`
  • : func: `MyClass.foo`
  • : func: `mymodule.MyClass.foo`

Le seul qui produit effectivement un lien est: func: `mymodule.MyClass.foo`, mais le lien est affiché comme mymodule.MyClass.foo() et je veux un lien qui est affiché comme foo() ou foo.
Aucune des options ci-dessus ne produit de lien dans Spyder.

Merci de votre aide.

62
saroele

La solution qui fonctionne pour Sphinx consiste à préfixer la référence avec ~.

Selon la documentation Sphinx sur Syntaxe de référence croisée ,

Si vous préfixez le contenu avec ~, le texte du lien ne sera que le dernier composant de la cible. Par exemple,: py: meth: ~Queue.Queue.get Fera référence à Queue.Queue.get mais affichera seulement get comme texte de lien.

La réponse est donc:

class MyClass():
    def foo(self):
        print 'foo'
    def bar(self):
        """This method does the same as :func:`~mymodule.MyClass.foo`"""
        print 'foo'

Il en résulte un html ressemblant à ceci: This method does the same as foo() et foo() est un lien.

Cependant, notez que cela peut ne pas s'afficher dans Spyder sous forme de lien.

63
saroele

Si vous souhaitez spécifier manuellement le texte du lien, vous pouvez utiliser:

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

Pour plus d'informations, consultez Cross-referencing Python objects .

29
devin_s