2010-02-03 5 views
11

Ich ziehe jeden Parameter (je nach Bedarf) auf der gleichen Linie zu dokumentieren, wo ich die Parameter, um zu erklären D.R.Y.Gibt es bei Sphinx eine Möglichkeit, Parameter zu dokumentieren und zu deklarieren?

anwenden Wenn ich Code wie dieses:

def foo(
     flab_nickers, # a series of under garments to process 
     has_polka_dots=False, 
     needs_pressing=False # Whether the list of garments should all be pressed 
    ): 
    ... 

Wie kann ich Wiederholung vermeiden die Parameter in der Doc-Zeichenfolge und behalten Sie die Parameter Erklärungen?

Ich möchte vermeiden:

def foo(
     flab_nickers, # a series of under garments to process 
     has_polka_dots=False, 
     needs_pressing=False # Whether the list of garments should all be pressed 
    ): 
    '''Foo does whatever. 

    * flab_nickers - a series of under garments to process 
    * needs_pressing - Whether the list of garments should all be pressed. 
     [Default False.] 

in Python dies möglich ist 2.6 oder Python 3 mit irgendeiner Art von Dekorateur Manipulation? Gibt es einen anderen Weg?

+0

Wenn Ihre RST sauber genug ist (Sphinx 'Param' s wirklich nicht helfen), sollte es einfach genug sein, um die Funktionsdefinition dann nach unten in den Docstring zu sehen. Ich vermeide den Standard-Sphinx-Stil (mit seinen 'Param's) und gehe für den Google-Stil, der * viel besser * im Code aussieht, und immer noch anständig, wenn er gerendert wird ([diese Frage] (http://stackoverflow.com/a/11176267/194586) spricht davon, Best-of-Both-Welten zu bekommen. –

Antwort

8

Ich würde dies tun.

Beginnen mit diesem Code.

def foo(
     flab_nickers, # a series of under garments to process 
     has_polka_dots=False, 
     needs_pressing=False # Whether the list of garments should all be pressed 
    ): 
    ... 

ich einen Parser schreiben würde, der die Funktion Parameterdefinitionen packt und baut die folgenden:

def foo(
     flab_nickers, 
     has_polka_dots=False, 
     needs_pressing=False, 
    ): 
    """foo 

    :param flab_nickers: a series of under garments to process 
    :type flab_nickers: list or tuple 
    :param has_polka_dots: default False 
    :type has_polka_dots: bool 
    :param needs_pressing: default False, Whether the list of garments should all be pressed 
    :type needs_pressing: bool 
    """ 
    ... 

, dass einige ziemlich geradlinig regex Verarbeitung der verschiedenen Argumente String-Muster ist in der Dokumentationsvorlage zu füllen .

Viele gute Python-IDEs (zum Beispiel PyCharm) verstehen die Standard-Sphinx-param-Notation und sogar VARs/Methoden im Bereich zu markieren, die nach Meinung der IDE nicht dem deklarierten Typ entsprechen.

Beachten Sie das zusätzliche Komma im Code; das ist nur, um die Dinge konsistent zu machen. Es schadet nicht, und es könnte die Dinge in Zukunft vereinfachen.

Sie können auch versuchen, den Python-Compiler zu verwenden, um einen Syntaxbaum zu erhalten, ihn zu überarbeiten und den Aktualisierungscode auszugeben. Ich habe das für andere Sprachen (nicht für Python) gemacht, also weiß ich ein bisschen darüber, aber ich weiß nicht, wie gut es in Python unterstützt wird.

Auch dies ist eine einmalige Transformation.

Die ursprünglichen Inline-Kommentare in der Funktionsdefinition folgen DRY nicht wirklich, da es sich um einen Kommentar in einer informellen Sprache handelt, der von allen außer den ausgeklügeltsten Tools nicht verwendet werden kann.

Die Sphinx-Kommentare sind näher an DRY, da sie sich in der RST-Auszeichnungssprache befinden, was die Verarbeitung mit normalen Textanalyse-Tools in docutils wesentlich erleichtert.

Es ist nur DRY, wenn Werkzeuge es verwenden können.

Nützliche Links: https://pythonhosted.org/an_example_pypi_project/sphinx.html#function-definitions http://sphinx-doc.org/domains.html#id1

+2

[Die Python-Dokumente für 'an_example_pypi_project'] (http://packages.python.org/an_example_pypi_project/sphinx.html#full-code-example) zeigt Sphinx-Docstring-Formatierungsoptionen. –

+0

Nein, der Kommentar in diesem Dokument funktioniert nicht: "Args: name (str): Der zu verwendende Name." – MeaCulpa

1

Sie können das nicht ohne einen Vorprozessor, als Kommentare für Python nicht existieren, wenn die Quelle kompiliert wurde. Um Wiederholungen zu vermeiden, entfernen Sie die Kommentare und dokumentieren Sie die Parameter nur im Docstring. Dies ist die Standardmethode zum Dokumentieren Ihrer Argumente.

+0

Vielleicht ist es eine schlechte Angewohnheit, aber ich habe den Geschmack für Inline-Dokumentation nach Verilog (Hardware-Design-Sprache) erworben, wo Parameterlisten für Top-Level-Module hundert Parameter haben können. Wenn Sie also die Verilog-Parameterdokumentation von der eigentlichen Parameterdokumentationszeile entfernen, könnten sie durch 100 Zeilen getrennt sein, was für die Wartbarkeit wirklich schlecht ist. –

+0

Und für diese Top-Level-Verilog-Module haben viele Leute diese Datei modifiziert, so dass Sie sich nicht darauf verlassen können, dass Menschen gute Bürger sind. Wie auch immer, du magst Recht haben. Es könnte ein quadratischer Pflock in einem runden Loch sein. –

+0

@Ross Rogers: Sphinx wird die schlechten Bürger für dich identifizieren. Wenn der Parameter: param name: nicht mit den tatsächlichen Argumenten übereinstimmt, erhalten Sie Warnungen. –

5

Anmerkungen sollen dieses Problem in Python zu teilweise adressieren 3:

http://www.python.org/dev/peps/pep-3107/

Ich bin mir nicht sicher, ob gab es eine Arbeit dieser Sphinx noch bei der Anwendung.

+0

Ich habe den Sphinx-Code gerade heute angeschaut und kann bestätigen, dass Sphinx zumindest Anmerkungen zurückgibt. Anmerkungen von Parametertypen sind irgendwie drin, scheinen aber im Moment meist rudimentär zu sein. – obskyr

Verwandte Themen