ลิงก์ไปยังเมธอดคลาสใน python docstring


90

ฉันต้องการเพิ่มลิงก์ไปยังเมธอดในคลาสของฉันจากภายใน docstring ของเมธอดอื่นของคลาสเดียวกัน ฉันต้องการให้ลิงก์ทำงานในสฟิงซ์และควรอยู่ใน Spyder และ Python IDE อื่น ๆ ด้วย

ฉันลองใช้หลายตัวเลือกและพบว่ามีเพียงตัวเดียวที่ใช้งานได้ แต่ก็ยุ่งยาก

สมมติว่าโครงสร้างต่อไปนี้ใน 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() ไม่มีตัวเลือกใดข้างต้นสร้างลิงค์ใน Spyderfoo

ขอบคุณสำหรับความช่วยเหลือของคุณ.


"เพิ่ม ... จากภายใน"หมายความว่าอย่างไร ??? ลิงก์และไฮเปอร์ลิงก์ต่างกันอย่างไร
eyquem

ฉันแทนที่hyperlinkด้วยlinkเพื่อหลีกเลี่ยงความสับสน
saroele

ฉันยังไม่เข้าใจคำถามของคุณดีนัก คุณหมายความว่าคุณต้องการที่จะดำเนินการจากสฟิงซ์หรือจาก Spyder หรือจากคนอื่น ๆ หลาม IDEs การสอบสวนของ docstring ของฟังก์ชั่นbarที่จะให้ข้อมูลที่"ฟังก์ชั่นหรือวิธีการที่คุณค้นหาคือ foo" ?
eyquem

ประการที่สองคุณสร้างความแตกต่างอะไรระหว่างmymodule.MyClass.foo()และfoo()? แล้วเรียกว่า"ดิสเพลย์"ล่ะ? เป็นการแสดงสตริงหรือไม่? หรือคุณต้องการวัตถุคืน? ในกรณีหลังนี้ paens ที่ปลายmymodule.MyClass.foo()และfoo()มีมากเกินไป
eyquem

ขออภัยในความสับสนมันยากที่จะอธิบายคำถามให้กระชับเสมอ ฉันแค่ต้องการมีลิงค์ที่คุณสามารถคลิกได้ซึ่งจะนำคุณไปยัง docstring of foo () (ในหน้าต่างเอกสารของ IDE หรือในการสร้าง html ของ Sphinx) เกี่ยวกับวงเล็บ: ถูกต้อง:: func: mymodule.MyClass.fooส่งผลให้ลิงก์มีวงเล็บ และฉันได้เปลี่ยนคำถามอีกครั้งเล็กน้อย
saroele

คำตอบ:


91

~วิธีการแก้ปัญหาที่เหมาะกับสฟิงซ์เป็นคำนำหน้าอ้างอิงด้วย

ตามเอกสารสฟิงซ์ในข้ามอ้างอิงไวยากรณ์ ,

หากคุณนำหน้าเนื้อหาด้วย ~ ข้อความลิงก์จะเป็นส่วนประกอบสุดท้ายของเป้าหมายเท่านั้น ตัวอย่างเช่น: py: meth: ~Queue.Queue.getจะอ้างถึง Queue.Queue.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 ฉันวางแผนที่จะปรับปรุงสถานการณ์นี้ในอนาคต ฉันเห็นด้วยอย่างยิ่งว่ามันเจ๋งมากที่มีมัน;)
Carlos Cordoba

เยี่ยมจริงๆรอคอย ขอบคุณสำหรับการทำงานของคุณบน Spyder!
saroele

คุณสามารถทำมันกับ:any:บทบาท - default_settingดูบันทึกเกี่ยวกับ
naught101

1
เป็นไปได้ไหมที่จะอ้างอิงโยงโดยไม่ใช้เส้นทางโมดูลแบบเต็ม
Jonathan

2
แทนที่จะผมพบว่ามันจะต้องมี:func: :meth:
Leo Fang

38

หากคุณต้องการระบุข้อความของลิงก์ด้วยตนเองคุณสามารถใช้ได้:

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

สำหรับข้อมูลเพิ่มเติมโปรดชำระเงินข้ามอ้างอิงวัตถุหลาม


ใช้งานได้ขอบคุณ เมื่อดูที่ลิงค์ฉันพบว่าการขึ้นต้นข้อมูลอ้างอิง~นั้นใกล้เคียงกับสิ่งที่ฉันต้องการมากขึ้น ฉันได้ใส่คำตอบแยกต่างหาก มันยังใช้ไม่ได้ใน 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 และฉันพยายามใช้ sphinx-quickstart ตามที่กล่าวไว้ในเอกสาร แต่ฉันคิดว่าฉันมีความเข้าใจผิดเกี่ยวกับกระบวนการ intsallation ฉันช่วยคุณไม่ได้ขอโทษ ฉันไม่รู้ว่าจะต้องมีอะไรดีจาก 'การเชื่อมโยงหลายมิติ' ในบริบทของสฟิงซ์
eyquem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.