Collegamento al metodo di classe in docstring python


90

Voglio aggiungere un collegamento a un metodo nella mia classe dall'interno della docstring di un altro metodo della stessa classe. Voglio che il collegamento funzioni in sphinx e preferenzialmente anche in Spyder e altri IDE di Python.

Ho provato diverse opzioni e ne ho trovata solo una che funziona, ma è ingombrante.

Supponiamo che la seguente struttura 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'

Ho provato le seguenti opzioni per <link to foo>:

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

L'unico che produce effettivamente un collegamento è: func: `mymodule.MyClass.foo`, ma il collegamento è mostrato come mymodule.MyClass.foo()e voglio un collegamento che sia mostrato come foo()o foo.
Nessuna delle opzioni precedenti produce un collegamento in Spyder.

Grazie per l'aiuto.


Cosa significa "aggiungi ... dall'interno" ??? Qual è la differenza tra un collegamento e un collegamento ipertestuale?
eyquem

Ho sostituito hyperlinkda linkper evitare confusione.
saroele

Continuo a non capire molto bene la tua domanda. Vuoi dire che vuoi eseguire, da Sphinx o da Spyder o da altri IDE Python, un'interrogazione della docstring della funzione barche darà l'informazione "la funzione o il metodo che cerchi è pippo" ?
eyquem

In secondo luogo, che differenza fai tra mymodule.MyClass.foo()e foo()? E come si chiama "display" ? È la visualizzazione di una stringa? O vuoi restituire un oggetto? In quest'ultimo caso le paene alla fine mymodule.MyClass.foo()e foo()sono troppe.
eyquem

Ci scusiamo per la confusione, è sempre difficile spiegare una domanda in modo conciso. Voglio solo avere un link su cui puoi cliccare, che ti porterà alla docstring di foo () (nella finestra della documentazione dell'IDE, o nella build html di Sphinx). Per quanto riguarda le parentesi: sono corrette:: func: ha mymodule.MyClass.foodato come risultato il collegamento con le parentesi. E ho riformulato di nuovo leggermente la domanda.
saroele

Risposte:


91

La soluzione che funziona per Sphinx è anteporre al riferimento ~.

Secondo la documentazione Sphinx sulla sintassi dei riferimenti incrociati ,

Se anteponi al contenuto ~, il testo del link sarà solo l'ultimo componente del target. Ad esempio ~Queue.Queue.get,: py: meth: farà riferimento a Queue.Queue.get ma visualizzerà solo get come testo del collegamento.

Quindi la risposta è:

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

Ciò si traduce in un html simile a questo:, This method does the same as foo()ed foo()è un collegamento.

Tuttavia, tieni presente che questo potrebbe non essere visualizzato in Spyder come collegamento.


15
( Spyder dev here ) @saroele Ho intenzione di migliorare questa situazione in futuro. Sono totalmente d'accordo che sarebbe davvero bello averlo;)
Carlos Cordoba

È davvero fantastico, non vedo l'ora. Grazie per tutto il tuo lavoro su Spyder!
saroele

Puoi farlo con il :any:ruolo - vedi la nota su default_setting.
nought101

1
è possibile un riferimento incrociato senza utilizzare il percorso completo del modulo?
Jonathan,

2
Invece di :func:, ho scoperto che deve essere :meth:.
Leo Fang

38

Se vuoi specificare manualmente il testo del link puoi usare:

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

Per ulteriori informazioni, controlla Riferimenti incrociati a oggetti Python .


Funziona, grazie. Guardando il collegamento, ho scoperto che il prefisso del riferimento con ~è più vicino a ciò di cui ho bisogno. L'ho messo in una risposta separata. Tuttavia non funziona ancora in Spyder ...
saroele

-4

Mi sembra che devi solo aggiungere __name__o __doc__alla tua espressione per ottenere quello che vuoi.
Non sono ancora sicuro di aver compreso correttamente l'obiettivo

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__

risultato

<unbound method MyClass.foo>
foo
I am the docstring of foo

<function foo at 0x011C27B0>
foo
I am the docstring of foo

1
Penso che tu abbia perso il punto della domanda: voglio avere un collegamento (collegamento ipertestuale) nell'html della mia documentazione costruita da Sphinx.
saroele

Hai ragione, mi manca il punto. E questo perché non conosco Sphinx. quindi ho provato ad installare Sphinx. Ma non ci sono riuscito. Sono su Windows e ho provato a utilizzare sphinx-quickstart come detto nel documento. Ma penso di avere un malinteso sul processo di installazione. Non posso aiutarti, mi dispiace. Non so cosa debba essere undertsood da "hyperlink" nel contesto di Sphinx.
eyquem
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.