Verspotten von Python-Iterablen für die Verwendung mit Sphinx

8

Ich benutze Sphinx, um ein Projekt zu dokumentieren, das von wxPython abhängt, mit der Erweiterung autodocs , so dass es automatisch Seiten aus unseren Docstrings generiert. Die Erweiterung autodocs funktioniert automatisch auf jedem Modul, das Sie import haben, was für unsere Pakete in Ordnung ist, ist aber ein Problem, wenn wir eine große externe Bibliothek wie wxPython verwenden. Anstatt also alles von wxPython zu generieren, verwende ich das import Bibliotheksmodul (vorher das externe Paket Mock ). Das einfachste Setup funktioniert für die meisten Teile von wxPython gut, aber ich bin in eine Situation geraten, die ich nicht leicht sehen kann (wahrscheinlich aufgrund meiner relativen Unkenntnis von Mock bis zu dieser Woche).

Derzeit hat das Ende meiner unittest.mock -Datei folgende Bedeutung:

%Vor%

Für alle wxPython-Module aber conf.py , dies funktioniert perfekt. Hier verwende ich jedoch die Funktion wx.lib.newevent [1 ] um ein Ereignis für ein bestimmtes Szenario zu erstellen. In diesem Fall bekomme ich eine Warnung über den newevent.NewCommandEvent() -Aufruf mit dem Hinweis NewCommandEvent() .

Während ich sehen kann, wie man patchen verwenden würde, um das zu bewältigen, um Komponententests aufzubauen (was Ich werde es im nächsten Monat tun!), Es fällt mir schwer zu sehen, wie ich das auf einer einfachen Ebene in meiner Sphinx-Konfiguration integrieren kann.

Bearbeiten: Ich habe gerade versucht, auch TypeError: 'Mock' object is not iterable zu verwenden. Dies erzeugt immer noch einen Fehler am selben Punkt, obwohl es jetzt MagicMock() produziert. Das scheint ein Schritt in die richtige Richtung zu sein, aber ich bin mir immer noch nicht sicher, wie ich damit umgehen soll, es explizit für dieses eine Modul einzurichten. Vielleicht ist das aber die beste Lösung?

Fußnoten

  1. Ja, das ist eine Funktion, eine Namenskonvention, die es wie eine Klasse aussehen lässt; wxPython folgt den C ++ - Namenskonventionen, die im gesamten wxWidgets-Toolkit verwendet werden.
Chris Krycho 18.12.2013, 18:54
quelle

1 Antwort

2

Aus dem Fehler sieht es so aus, als ob es tatsächlich newevent.NewCommandEvent() ausführt, also nehme ich an, dass irgendwo in Ihrem Code eine Zeile der obersten Ebene steht:

%Vor%

Wenn autodoc das Modul importiert, versucht es diese Codezeile auszuführen, aber da NewCommandEvent tatsächlich ein Mock Objekt ist, kann Python seine Ausgabe nicht an das (event, binder) Tupel binden. Es gibt zwei mögliche Lösungen. Der erste besteht darin, den Code dahingehend zu ändern, dass er beim Import nicht ausgeführt wird, indem er in if __name__ == '__main__' eingeschlossen wird. Ich würde diese Lösung empfehlen, da das Erstellen solcher Objekte beim Importieren oft vorzeitige Nebenwirkungen haben kann.

Die zweite Lösung besteht darin, dem Mock -Objekt mitzuteilen, dass entsprechende Werte zurückgegeben werden sollen:

%Vor%

Wenn Sie jedoch irgendetwas in Ihrem Code mit den zurückgegebenen Werten tun, könnten Sie das gleiche Problem später noch einmal bekommen.

    
aquavitae 07.01.2014, 07:44
quelle