2016-08-04 44 views
3

Ich versuche herauszufinden, die beste Möglichkeit, um Code in einem Jupyter/iPython Notebook und den gleichen Code innerhalb einer Klassenmethode synchron zu halten. Hier ist der Anwendungsfall:Synchronisieren von Code zwischen Jupyter/iPython Notebook-Skript und Klassenmethoden

Ich schrieb ein langes Skript, das Pandas in einem Notebook verwendet, und haben mehrere Zellen, die die Entwicklung einfach gemacht, weil ich Zwischenergebnisse innerhalb des Notebooks überprüfen konnte. Dies ist sehr nützlich bei Pandas Skripten. Ich habe diesen Arbeitscode in eine Python-Datei ".py" heruntergeladen und dieses Skript in eine Methode in einer Python-Klasse in meinem Programm umgewandelt, die mit den Eingabedaten instanziiert wird und die Ausgabe als Ergebnis dieser Methode bereitstellt. Alles funktioniert super. Diese Python-Klasse wird in einer viel größeren Anwendung verwendet, so dass dies wirklich möglich ist.

Aber dann gab es einen Fehler für einen bestimmten Datensatz in der Implementierung in der Methode, die auch in meinem Skript war. Ich könnte zurück zu meinem Notizbuch gehen und Schritt für Schritt durch die verschiedenen Zellen gehen, um das Problem zu finden. Ich behebe das Problem, aber dann muss ich die Änderung vorsichtig im normalen Python-Klassenmethodencode vornehmen. Das ist ein bisschen schmerzhaft.

Idealerweise würde ich gerne eine Klassenmethode über Zellen hinweg ausführen können, um Zwischenergebnisse zu überprüfen. Ich kann nicht herausfinden, wie das geht.

Was ist also die beste Methode, einen Skriptcode und Code, die in eine Klassenmethode eingebettet sind, synchron zu halten?

Ja, ich weiß, dass ich die Klasse in das Notizbuch importieren kann, aber dann verliere ich die Fähigkeit, Zwischenergebnisse innerhalb der Klassenmethode über einzelne Zellen zu betrachten, was ich tue, wenn es ein reines Skript ist. Mit Pandas ist das sehr nützlich.

+0

Können Sie dies mit "jupyter" markieren?Dies ist das Tag, mit dem das jupyter-Projekt verknüpft ist, wenn von der Website des jupyter-Projekts aus navigiert wird. – Utkonos

+0

@Utkonos Ich habe dieses Tag hinzugefügt – Irv

Antwort

4

Ich habe den gleichen Entwicklungs-Workflow verwendet und erkenne den Wert, mit dem jupyter-Notebook durch den Code gehen zu können. Ich habe mehrere Pakete entwickelt, indem ich zunächst die Details hashe und dann das polierte Produkt schließlich in separate .py-Dateien verschiebe. Ich glaube nicht, dass es eine einfache Lösung für die Unannehmlichkeiten gibt, denen Sie begegnen (ich bin auf die gleichen Probleme gestoßen), aber ich werde meine Praxis beschreiben (ich bin nicht so kühn, sie als die "beste" Praxis zu bezeichnen) und vielleicht auch wird in Ihrem Anwendungsfall hilfreich sein.

Meiner Erfahrung nach ist es einfacher, nachdem ich ein Modul/Paket von meinem jupyter Notebook erstellt habe, den Code außerhalb des Notebooks zu pflegen und zu entwickeln und das Modul zum Testen in das Notebook zu importieren.

Jede Methode klein zu halten ist im Allgemeinen eine gute Übung und ist sehr hilfreich, um die Logik bei jedem Schritt mit dem Notebook zu testen. Sie können größere "öffentliche" Methoden in kleinere "private" Methoden mit einem führenden Unterstrich (zB '_load_file') zerlegen. Sie können die "privaten" Methoden in Ihrem Notizbuch zum Testen/Debuggen aufrufen, aber die Benutzer Ihres Moduls sollten es ignorieren diese Methoden.

können Sie die reload Funktion im importlib Modul verwenden, um schnell Ihre importierten Module mit Änderungen an der Quelle zu aktualisieren.

import mymodule 
from importlib import reload 
reload(mymodule) 

Aufruf import wieder nicht wirklich Ihren Namensraum aktualisieren. Sie müssen die reload Funktion (oder ähnlich), um zu erzwingen, dass Python den Modulcode neu kompiliert/ausführt

Zwangsläufig müssen Sie immer noch einzelne Funktionen Zeile für Zeile durchlaufen, aber wenn Sie Ihren Code in kleine Methoden zerlegt haben, ist die Menge an Code, den Sie im Notebook "neu schreiben" müssen, sehr klein.

+0

Das ist eine nette Idee, und es schlägt auch vor, dass ich im anfänglichen Workflow im Notizbuch viele kleine Methoden erstellen sollte, die jeden Schritt ausführen, anstatt es als nur ein großes Skript zu haben . Dann könnte ich die Zwischenergebnisse, die mit jeder Methode erstellt wurden, sowohl im Code außerhalb des Notebooks als auch innerhalb des Notebooks einfacher überprüfen. – Irv