Liên kết đến phương thức lớp trong python docstring


87

Tôi muốn thêm liên kết đến một phương thức trong lớp của mình từ bên trong docstring của một phương thức khác cùng lớp. Tôi muốn liên kết hoạt động trong sphinx và ưu tiên cũng trong Spyder và các IDE Python khác.

Tôi đã thử một số tùy chọn và chỉ tìm thấy một tùy chọn hoạt động, nhưng nó cồng kềnh.

Giả sử cấu trúc sau trong mymodule.py

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

Tôi đã thử các tùy chọn sau cho <link to foo>:

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

Liên kết duy nhất tạo liên kết hiệu quả là: func: `mymodule.MyClass.foo`, nhưng liên kết được hiển thị dưới dạng mymodule.MyClass.foo()và tôi muốn một liên kết được hiển thị là foo()hoặc foo.
Không có tùy chọn nào ở trên tạo ra liên kết trong Spyder.

Cảm ơn bạn đã giúp đỡ.


"Thêm ... từ bên trong" nghĩa là gì ??? Sự khác biệt giữa liên kết và siêu liên kết là gì?
eyquem

Tôi thay thế hyperlinkbằng linkđể tránh nhầm lẫn.
saroele

Tôi vẫn chưa hiểu lắm câu hỏi của bạn. Ý của bạn là bạn muốn thực hiện, từ Sphinx hoặc từ Spyder hoặc từ các IDE Python khác, một cuộc thẩm vấn chuỗi tài liệu của hàm barsẽ cung cấp thông tin "hàm hoặc phương pháp bạn tìm kiếm là foo" ?
băng che mắt

Thứ hai, bạn tạo ra sự khác biệt nào giữa mymodule.MyClass.foo()foo()? Và bạn gọi "màn hình" là gì? Nó có phải là sự hiển thị của một chuỗi không? Hay bạn muốn một đối tượng được trả lại? Trong trường hợp thứ hai này, các dấu chấm ở cuối mymodule.MyClass.foo()foo()quá nhiều.
sát

Xin lỗi vì sự nhầm lẫn, thật khó để giải thích một câu hỏi một cách ngắn gọn. Tôi chỉ muốn có một liên kết mà bạn có thể nhấp vào, liên kết đó sẽ đưa bạn đến docstring của foo () (trong cửa sổ tài liệu của IDE hoặc trong bản dựng html của Sphinx). Về dấu ngoặc đơn: họ đúng:: func: mymodule.MyClass.foodẫn đến liên kết có dấu ngoặc đơn. Và tôi đã diễn đạt lại câu hỏi một lần nữa.
saroele

Câu trả lời:


88

Giải pháp hiệu quả cho Sphinx là thêm tiền tố tham chiếu ~.

Theo tài liệu Sphinx về Cú pháp tham chiếu chéo ,

Nếu bạn đặt tiền tố nội dung bằng ~, văn bản liên kết sẽ chỉ là thành phần cuối cùng của đích. Ví dụ: py: meth: ~Queue.Queue.getsẽ tham chiếu đến Queue.Queue.get nhưng chỉ hiển thị get dưới dạng văn bản liên kết.

Vì vậy, câu trả lời là:

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

Điều này dẫn đến một html trông giống như sau: This method does the same as foo()foo()là một liên kết.

Tuy nhiên, lưu ý rằng điều này có thể không hiển thị trong Spyder dưới dạng một liên kết.


15
(Nhà phát triển Spyder tại đây ) @saroele Tôi dự định cải thiện tình hình này trong tương lai. Tôi hoàn toàn đồng ý nó muốn được thực sự mát mẻ để có nó;)
Carlos Cordoba

Điều đó thực sự tuyệt vời, rất mong đợi. Cảm ơn vì tất cả công việc của bạn trên Spyder!
saroele

Bạn có thể làm điều đó với :any:vai trò - hãy xem ghi chú về default_setting.
naught101

1
có thể tham chiếu chéo mà không sử dụng đường dẫn mô-đun đầy đủ không?
Jonathan

2
Thay vào đó :func:, tôi thấy nó phải như vậy :meth:.
Leo Fang

37

Nếu bạn muốn chỉ định thủ công văn bản của liên kết, bạn có thể sử dụng:

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

Để biết thêm thông tin, hãy kiểm tra Tham chiếu chéo các đối tượng Python .


Điều này hoạt động, cảm ơn. Bằng cách xem liên kết, tôi phát hiện ra rằng tiền tố tham chiếu với ~gần với những gì tôi cần hơn. Tôi đã đặt điều đó trong một câu trả lời riêng. Nó vẫn không hoạt động trong tuy nhiên Spyder ...
saroele

-4

Đối với tôi, dường như bạn chỉ cần thêm __name__hoặc __doc__vào biểu thức của mình để có được những gì bạn muốn.
Tôi vẫn không chắc mình đã hiểu đúng mục đích

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__

kết quả

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

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

1
Tôi nghĩ rằng bạn đã bỏ lỡ điểm của câu hỏi: Tôi muốn có một liên kết (siêu liên kết) trong html của tài liệu của tôi do Sphinx xây dựng.
saroele

Bạn nói đúng, tôi bỏ lỡ quan điểm. Và đó là bởi vì tôi không biết Sphinx. vì vậy tôi đã cố gắng cài đặt Sphinx. Nhưng tôi đã không thành công. Tôi đang sử dụng Windows và tôi đã cố gắng sử dụng sphinx-quickstart như đã nói trong tài liệu. Nhưng tôi nghĩ rằng tôi đã hiểu sai về quá trình lắp ráp. Tôi không thể giúp bạn, xin lỗi. Tôi không biết những gì phải được thực hiện bởi 'siêu liên kết' trong bối cảnh của Sphinx.
eyquem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.