Python docstring'deki sınıf yöntemine bağlantı


90

Sınıfımdaki bir yönteme, aynı sınıftaki başka bir yöntemin docstring'inden bir bağlantı eklemek istiyorum. Bağlantının sphinx'te ve tercihen Spyder ve diğer Python IDE'lerinde çalışmasını istiyorum.

Birkaç seçenek denedim ve işe yarayan bir tane buldum, ancak bu külfetli.

Aşağıdaki yapıyı varsayalım mymodule.py

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

Aşağıdaki seçenekleri denedim <link to foo>:

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

Etkin bir bağlantı üreten tek: func: "mymodule.MyClass.foo", ancak bağlantı olarak gösteriliyor mymodule.MyClass.foo()ve foo()veya olarak gösterilen bir bağlantı istiyorum foo.
Yukarıdaki seçeneklerden hiçbiri Spyder'da bir bağlantı oluşturmaz.

Yardımınız için teşekkürler.


" İçinden ekle ..." ne anlama geliyor ??? Bir bağlantı ile köprü arasındaki fark nedir?
eyquem

Ben yerini hyperlinktarafından linkönlemek karışıklığa.
saroele

Hala sorunuzu çok iyi anlamıyorum. Sphinx'ten veya Spyder'dan veya diğer Python IDE'lerinden "aradığınız işlev veya yöntem foo"bar bilgisini verecek olan işlevin docstring sorgusunu gerçekleştirmek istediğinizi mi söylüyorsunuz ?
eyquem

İkincisi, mymodule.MyClass.foo()ve arasında ne fark ediyorsunuz foo()? Peki "görüntülü" ne diyorsunuz ? Bir dizenin görüntüsü mü? Yoksa bir nesnenin iade edilmesini mi istiyorsunuz? Bu ikinci durumda, sondaki mymodule.MyClass.foo()ve foo()çok fazla olan kağıtlar .
eyquem

Karışıklık için üzgünüm, bir soruyu kısaca açıklamak her zaman zordur. Sadece tıklayabileceğiniz bir bağlantıya sahip olmak istiyorum, bu sizi foo () 'nun docstring'ine götürecek (IDE'nin dokümantasyon penceresinde veya Sphinx'in html yapısında). Parantezlerle ilgili olarak: doğrudurlar:: func: mymodule.MyClass.foobağın parantez içermesiyle sonuçlandı. Ve soruyu biraz yeniden ifade ettim.
saroele

Yanıtlar:


91

Sphinx için işe yarayan çözüm, referansın önekini kullanmaktır ~.

Çapraz Referans Sözdizimi hakkındaki Sphinx belgelerine göre ,

İçeriğin başına ~ eklerseniz, bağlantı metni hedefin yalnızca son bileşeni olur. Örneğin ~Queue.Queue.get,: py: meth: Queue.Queue.get'e başvurur, ancak bağlantı metni olarak yalnızca get görüntülenir.

Yani cevap şu:

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

Bu This method does the same as foo(), foo()şu şekilde görünen bir html ile sonuçlanır: ve bir bağlantıdır.

Ancak, bunun Spyder'da bir bağlantı olarak görüntülenmeyebileceğini unutmayın.


15
( Spyder dev burada ) @saroele Bu durumu gelecekte iyileştirmeyi planlıyorum. Buna sahip olmanın gerçekten harika olacağına tamamen katılıyorum;)
Carlos Cordoba

Bu gerçekten harika, dört gözle bekliyorum. Spyder üzerindeki tüm çalışmalarınız için teşekkürler!
saroele

:any:Rol ile yapabilirsiniz - hakkındaki nota bakın default_setting.
naught101

1
tam modül yolunu kullanmadan çapraz referans yapmak mümkün müdür?
Jonathan

2
Bunun yerine :func:, olması gerektiğini buldum :meth:.
Leo Fang

38

Bağlantının metnini manuel olarak belirtmek isterseniz kullanabilirsiniz:

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

Daha fazla bilgi için Python nesnelerine çapraz referans verme konusuna bakın .


Bu çalışıyor, teşekkürler. Bağlantıya bakarak, referansın ön ekinin ~ihtiyacım olan şeye daha yakın olduğunu öğrendim. Bunu ayrı bir cevaba koydum. Yine de Spyder'da çalışmıyor ...
saroele

-4

Bana öyle geliyor ki, istediğinizi elde etmek için ifadenize __name__ya da eklemeniz __doc__gerekiyor.
Hala amacı doğru anladığımdan emin değilim

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__

sonuç

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

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

1
Sanırım sorunun amacını kaçırdınız: Sphinx tarafından oluşturulmuş dokümantasyonumun html'sinde bir bağlantı (hiperlink) olmasını istiyorum.
saroele

Haklısın, noktayı özledim. Ve bunun sebebi Sphinx'i bilmemem. bu yüzden Sphinx'i kurmaya çalıştım. Ama başaramadım. Windows kullanıyorum ve belgede belirtildiği gibi sphinx-quickstart'ı kullanmaya çalıştım. Ama sanırım kurulum sürecini yanlış anladım. Sana yardım edemem üzgünüm. Sphinx bağlamında 'köprü' ile neyin anlaşılması gerektiğini bilmiyorum.
eyquem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.