Tautan ke metode kelas di python docstring

89

Saya ingin menambahkan link ke metode di kelas saya dari dalam docstring metode lain di kelas yang sama. Saya ingin tautannya berfungsi di sphinx dan terutama juga di Spyder dan IDE Python lainnya.

Saya mencoba beberapa opsi dan hanya menemukan satu yang berfungsi, tetapi itu tidak praktis.

Misalkan struktur berikut di mymodule.py

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

Saya mencoba opsi berikut untuk <link to foo>:

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

Satu-satunya yang secara efektif menghasilkan tautan adalah: func: `mymodule.MyClass.foo`, tetapi tautannya ditampilkan sebagai mymodule.MyClass.foo()dan saya ingin tautan yang ditampilkan sebagai foo()atau foo.
Tak satu pun dari opsi di atas menghasilkan tautan di Spyder.

Terima kasih atas bantuan Anda.

saroele.dll
sumber
Apa artinya "tambahkan ... dari dalam" ??? Apa perbedaan antara tautan dan hyperlink?
eyquem
Saya diganti hyperlinkoleh linkuntuk menghindari kebingungan.
saroele
Saya masih belum mengerti dengan baik pertanyaan Anda. Apakah yang Anda maksud bahwa Anda ingin melakukan, dari Sphinx atau dari Spyder atau dari Python IDE lainnya, sebuah interogasi dari fungsi docstring baryang akan memberikan informasi "fungsi atau metode yang Anda cari adalah foo" ?
eyquem
Kedua, perbedaan apa yang Anda buat antara mymodule.MyClass.foo()dan foo()? Dan apa yang Anda sebut "tampilan" ? Apakah ini tampilan string? Atau apakah Anda ingin sebuah benda dikembalikan? Dalam kasus terakhir ini, paens di akhir mymodule.MyClass.foo()dan foo()terlalu banyak.
eyquem
Maaf atas kebingungannya, selalu sulit untuk menjelaskan pertanyaan secara ringkas. Saya hanya ingin memiliki link yang dapat Anda klik, yang akan membawa Anda ke docstring dari foo () (di jendela dokumentasi IDE, atau di html build Sphinx). Mengenai tanda kurung: mereka benar:: func: mymodule.MyClass.foomenghasilkan tautan yang memiliki tanda kurung. Dan saya telah sedikit mengulang pertanyaan itu.
saroele

Jawaban:

90

Solusi yang berfungsi untuk Sphinx adalah memberi awalan referensi dengan ~.

Sesuai dokumentasi Sphinx tentang Sintaks Referensi Silang ,

Jika Anda mengawali konten dengan ~, teks tautan hanya akan menjadi komponen terakhir dari target. Misalnya ~Queue.Queue.get,: py: meth: akan merujuk ke Queue.Queue.get tetapi hanya menampilkan get sebagai teks tautan.

Jadi jawabannya adalah:

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

Ini menghasilkan html yang terlihat seperti ini:, This method does the same as foo()dan foo()merupakan tautan.

Namun, perhatikan bahwa ini mungkin tidak ditampilkan di Spyder sebagai tautan.

saroele.dll
sumber
15
( Spyder dev di sini ) @saroele Saya berencana untuk memperbaiki situasi ini di masa mendatang. Saya sangat setuju akan sangat keren untuk memilikinya;)
Carlos Cordoba
Itu sangat bagus, menantikannya. Terima kasih untuk semua pekerjaan Anda di Spyder!
saroele
Anda dapat melakukannya dengan :any:peran - lihat catatan tentang default_setting.
ada101
1
apakah mungkin untuk melakukan referensi silang tanpa menggunakan jalur modul lengkap?
Jonathan
2
Alih-alih :func:, saya merasa itu harus :meth:.
Leo Fang
37

Jika Anda ingin menentukan teks link secara manual, Anda dapat menggunakan:

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

Untuk informasi selengkapnya, periksa referensi silang objek Python .

devin_s
sumber
Ini berhasil, terima kasih. Dengan melihat tautannya, saya menemukan bahwa memberi awalan pada referensi ~lebih dekat dengan apa yang saya butuhkan. Saya telah menempatkannya dalam jawaban terpisah. Ini masih tidak bekerja di Spyder namun ...
saroele
-4

Bagi saya tampaknya Anda hanya perlu menambahkan __name__atau __doc__pada ekspresi Anda untuk mendapatkan apa yang Anda inginkan.
Saya masih belum yakin benar memahami tujuannya

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__

hasil

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

<function foo at 0x011C27B0>
foo
I am the docstring of foo
eyquem
sumber
1
Saya pikir Anda melewatkan inti pertanyaan: Saya ingin memiliki tautan (hyperlink) di html dokumentasi saya yang dibuat oleh Sphinx.
saroele
Anda benar, saya melewatkan intinya. Dan itu karena saya tidak tahu Sphinx. jadi saya mencoba menginstal Sphinx. Tapi saya tidak berhasil. Saya menggunakan Windows dan saya mencoba menggunakan sphinx-quickstart seperti yang dikatakan di dokumen. Tapi saya rasa saya memiliki kesalahpahaman tentang proses intsallation. Saya tidak dapat membantu Anda, maaf. Entah apa yang harus dilakukan oleh 'hyperlink' dalam konteks Sphinx.
eyquem