Behalten Sie die Standardargumente der eingepackten / dekorierten Python-Funktion in der Sphinx-Dokumentation bei

8

Wie kann ich *args und **kwargs durch die echte Signatur in der Dokumentation dekorierter Funktionen ersetzen?

Nehmen wir an, ich habe die folgende Dekoration und dekorierte Funktion:

%Vor%

Entsprechend ruft uns print(myfunc(3, 4)) auf:

%Vor%

So weit, so gut. Ich möchte auch, dass meine Bibliothek, die myfunc enthält, ordnungsgemäß mit Sphinx dokumentiert wird. Wenn ich jedoch meine Funktion in meine Sphinx-HTML-Seite über:

einschließe %Vor%

Es wird tatsächlich angezeigt als:

myfunc (* args, ** kwargs)

Unscharfe Addition

  • Parameter:
    • foo : Leiste!
    • bar : bla bla
  • Rückgabe:  foo + bar

Wie kann ich den generischen myfunc(*args, **kwargs) im Titel loswerden? Dies sollte durch myfunc (foo = 42, bar = 43) ersetzt werden. Wie kann ich Sphinx oder meinen Dekorator mywrapper so ändern, dass die Standardschlüsselwortargumente in der Dokumentation beibehalten werden?

BEARBEITEN :

Wie schon gesagt, wurde diese Frage schon einmal gestellt, aber die Antworten sind nicht so hilfreich.

Allerdings hatte ich eine Idee und frage mich, ob das möglich ist. Setzt Sphinx eine Umgebungsvariable, die meinem Modul mitteilt, dass es tatsächlich von Sphinx importiert wird? Wenn das der Fall ist, könnte ich einfach meine eigenen Wrapper patchern. Wenn mein Modul von Sphinx importiert wird, geben meine Wrapper die ursprünglichen Funktionen zurück, anstatt sie zu umhüllen. Somit wird die Signatur erhalten.

    
SmCaterpillar 06.02.2015, 13:25
quelle

2 Antworten

4

Ich habe einen Affen-Patch für functools.wraps gefunden. Dementsprechend habe ich das einfach zum Skript conf.py im Ordner sphinx source meiner Projektdokumentation hinzugefügt:

%Vor%

Beim Erstellen der HTML-Seite über make html wird also functools.wraps durch diesen Dekorator no_op_wraps ersetzt, der absolut nichts anderes tut, als einfach die ursprüngliche Funktion zurückzugeben.

    
SmCaterpillar 06.02.2015, 17:52
quelle
2

Normalerweise können Sie nicht. Das liegt daran, dass die Variablennamen, die als Parameter in der Wrapped-Funktion verwendet werden, nicht einmal in der Wrapped-Funktion vorhanden sind - also weiß Sphinx nichts über sie.

Das ist ein bekanntes kompliziertes Problem in Python - so sehr, dass neuere Versionen - darunter nicht nur Python 3, sondern auch Python 2.7 - ein __wrapped__ -Attribut für die Klasse enthalten haben, die die richtige Verwendung von functools.wraps machen - Auf diese Weise kann man sich bei der Überprüfung der dekorierten Funktion über die tatsächliche Wrapped-Funktion informieren, indem man __wrapped__ betrachtet. Unglücklicherweise ignoriert Sphinx das __wrapped__ und zeigt stattdessen die Info über die Wrapper-Funktion an.

SO ist es eine Sache, dies dem Sphinx-Projekt selbst als Fehler zu melden - es sollte __wrapped__ berücksichtigen.

Eine Umgehungslösung dafür wäre, die Wrapperfunktion so zu ändern, dass sie mehr Informationen über das Wrapped enthält - wie seine Signatur. Sie könnten also eine andere Funktion schreiben, die anstelle von "functools.wraps" für Ihr Projekt aufgerufen wird, was genau das macht: Funktionssignatur zu seinem Docstring, falls vorhanden. Leider ist das Abrufen der Funktionssignaturen in Python älter als 3.3 schwierig - (für 3.3 und neuer, überprüfen Sie Ссылка ) - aber für eine naive Form könnte man trotzdem eine andere Version von "Wraps" schreiben:

%Vor%

Und benutze das anstelle von "functools.wraps". Es würde zumindest eine Zeile mit den Parameternamen (aber nicht den Defalt-Werten) als erste Zeile in den Dokumenten hinzufügen.

--- Hmm ... Vielleicht wäre es einfacher, Sphinx zu benutzen, um __wrapped__ zu benutzen, bevor es richtig gemacht wird.

    
jsbueno 06.02.2015 13:59
quelle