2013-04-09 15 views
12

Mam kilka klas, które używają „specjalne metody”:Dołącz konkretne specjalne metody w sfinks

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 

teraz chciałbym do generowania dokumentacji HTML dla tego używając Sfinksa i AutoDoc. Jak mogę powiedzieć Sphinxowi, aby udokumentował __contains__? Próbowałem dodanie

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

do conf.py, ale również __dict__ który zdecydowanie nie chce.

Obecnie odpowiednie porcje wygląd myproject.rst plików takich jak:

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

edycji dodając

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

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

robi dodać dokumentację tej metody, ale w osobnym rozdziale - nie tak część dokumentacji klasy Foo.

+0

OTTOMH - Wierzę, że muszą być wyraźne i używać '.. automethod :: __contains__' jak nie wierzę' specjalnego members' akceptuje żadnej formy filtrowania parametr –

+0

Przykład w pytaniu nie przedstawia dokładnie argumentu za udokumentowaniem tej metody. Nie ma sensu dokumentowanie '__contains__', jeśli po prostu powie ci, czy obiekt jest członkiem kolekcji. To [już udokumentowane w Pythonie] (http://docs.python.org/3/reference/datamodel.html#object.__contains__). Możesz podać w docstringu dla klasy, że obsługiwany jest operator 'in'. –

+0

@JonClements - Wydaje się być blisko. Dodałem '.. automethod :: myproject.foomodule.Foo .__ includes__'' po powyższym przykładzie' ..automethod' i dodano dokumentację, ale jest ona dokumentowana oddzielnie od klasy. – mgilson

Odpowiedz

3

Obecnie nie jestem w 100% zachwycony tym rozwiązaniem, więc mam nadzieję, że ktoś może go ulepszyć. Jednak sposób mam rozwiązać tego problemu jest wykonanie następujących czynności:

.. 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__ 

Tu rzeczywiście trzeba powiedzieć autodoc uniknąć dokumentowania atrybuty klasy (automatycznie) i następnie trzeba dodać je z powrotem na wprost. Powodem jest to, że najwyraźniej, gdy jawnie zagnieżdżasz komendy, explicit ones come first. Jeśli tylko jednoznacznie dodaję __contains__, to pojawi się przed atrybutami, które mi się nie podobają.

+0

Czy http://stackoverflow.com/a/21449475/832230 pomaga? –

11

Można dodać:

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

do pliku .rst aby pokazać specjalne członków, z wyjątkiem __dict__ i __weakref__

7

Co pracował dla mnie jest dodanie”.. automethod :: methodName "

Dyrektywy w docstringu klasy, zamiast robić to w pliku .rst.

Tak, można zmienić "Foo docstring" do

""" 
Foo docstring 

.. automethod:: __contains__ 
""" 
+0

Dobrze wiedzieć. Jestem (niestety) nie jestem już w stanie używać sfinksa - więc nie mogę tego przetestować. Na pewno dam sobie spokój, jeśli kiedykolwiek będę miał szansę. – mgilson

4

Opcja special-members teraz trwa argumentów (jest to nowa funkcja w Sphinx 1.2).

Tak to powinno działać:

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