2013-04-09 26 views
12

tôi có một loạt các lớp học mà sử dụng "đặc biệt phương pháp":Bao gồm cụ thể đặc biệt-phương pháp trong nhân sư

class Foo(object): 
    "Foo docstring" 

    attr1 = "Attribute!" #: first attribute 
    attr2 = "Another Attribute!" #: second attribute 

    def __init__(self): 
     self.x = 12 

    def say_hello(self): 
     """ 
     say_hello(self) -> None 

     Issue a friendly greeting. 
     """ 
     print "Hello! x is {0}".format(self.x) 

    def __contains__(self,other): 
     """Implement ``other in self``""" 
     return other == self.x 

bây giờ tôi muốn tạo tài liệu html cho điều này sử dụng Sphinx và autodoc. Làm thế nào để tôi nói với Nhân sư ghi lại tài liệu __contains__? Tôi đã thử thêm

autodoc_default_flags = ['members', 'undoc-members', 'special-members'] 

để conf.py, nhưng điều đó cũng bao gồm __dict__ mà tôi chắc chắn không muốn.

Hiện nay, các phần liên quan của giao diện myproject.rst tập tin như:

.. automodule:: myproject.foomodule 
    :members: 
    :undoc-members: 
    :show-inheritance: 

chỉnh sửa thêm

.. automodule:: myproject.foomodule 
    :members: 
    :undoc-members: 
    :show-inheritance: 

.. automethod:: myproject.foomodule.Foo.__contains__ 

làm thêm tài liệu của phương pháp đó, nhưng trong một phần riêng biệt - Không như một phần của tài liệu lớp học Foo.

+0

OTTOMH - Tôi tin rằng bạn phải rõ ràng và sử dụng '.. automethod :: __contains__' như tôi không tin 'chuyên members' chấp nhận bất kỳ hình thức lọc tham số –

+0

Ví dụ trong câu hỏi không chính xác trình bày một trường hợp hấp dẫn để ghi lại phương pháp này. Không có vấn đề gì trong việc ghi lại '__contains__' nếu nó chỉ cho bạn biết một đối tượng có phải là thành viên của một bộ sưu tập hay không. Đó là [đã được ghi lại bằng Python] (http://docs.python.org/3/reference/datamodel.html#object.__contains__). Bạn có thể đề cập đến trong chuỗi docstring cho lớp mà toán tử 'in' được hỗ trợ. –

+0

@JonClements - Điều đó có vẻ gần gũi. Tôi đã thêm một '.. automethod :: myproject.foomodule.Foo .__ contains__'' sau công cụ' ..automethod' ở trên và nó thêm tài liệu, nhưng nó được ghi lại riêng biệt với lớp. – mgilson

Trả lời

3

Tôi hiện không vui mừng 100% với giải pháp này, vì vậy tôi hy vọng ai đó có thể cùng cải thiện nó. Tuy nhiên, cách Tôi đã giải quyết vấn đề này là phải làm như sau:

.. automodule:: myproject.foomodule 
    :members: 
    :undoc-members: 
    :show-inheritance: 

    .. autoclass:: myproject.foomodule.Foo 
     :exclude-members: attr1,attr2 

     .. autoattribute:: myproject.foomodule.Foo.attr1 

     .. autoattribute:: myproject.foomodule.Foo.attr2 

     .. automethod:: myproject.foomodule.Foo.__contains__ 

Ở đây tôi thực sự cần phải nói với autodoc để tránh ghi lại các thuộc tính lớp (tự động) và sau đó tôi cần phải thêm chúng lại một cách rõ ràng. Lý do là vì rõ ràng khi bạn đặt lệnh rõ ràng, explicit ones come first. Nếu tôi chỉ nói rõ ràng để thêm __contains__, thì nó hiển thị trước các thuộc tính mà tôi không thích.

+0

http://stackoverflow.com/a/21449475/832230 có trợ giúp không? –

11

Bạn có thể thêm:

:special-members: 
:exclude-members: __dict__,__weakref__ 

Để file .rst để hiển thị các thành viên đặc biệt, ngoại trừ __dict____weakref__

7

gì làm việc đối với tôi là cách thêm" .. automethod :: methodName "

chỉ thị trong chuỗi tài liệu của lớp, thay vì thực hiện trong tệp .rst.

Vì vậy, bạn có thể thay đổi "Foo docstring" để

""" 
Foo docstring 

.. automethod:: __contains__ 
""" 
+0

Điều cần biết. Tôi (không may) không còn có thể sử dụng nhân sư nữa - Vì vậy tôi không thể kiểm tra điều này. Tôi chắc chắn sẽ cho đi nếu tôi có cơ hội. – mgilson

4

Tùy chọn special-members bây giờ có đối số (đây là một tính năng mới trong Sphinx 1.2).

Vì vậy, điều này sẽ làm việc:

.. automodule:: myproject.foomodule 
    :members: 
    :undoc-members: 
    :special-members: __contains__ 
    :show-inheritance: 
Các vấn đề liên quan