Manchmal teste ich Python-Module während der Entwicklung, indem ich eine interaktive Python-Eingabeaufforderung in einem Terminal ausführe, mein neues Modul importiere und die Funktionalität teste. Da sich mein Code in der Entwicklung befindet, gibt es natürlich Fehler und häufige Neustarts des Interpreters sind erforderlich. Dies ist nicht allzu schmerzhaft, wenn ich vor dem Neustart nur ein paar Interpreterzeilen ausgeführt habe: Meine Tastenfolge beim Neustart des Interpreters sieht aus wie Up Up Enter Up Up Enter ... aber extrapolieren Sie sie auf 5 oder mehr Anweisungen, die wiederholt werden sollen wird ernsthaft schmerzhaft!

Natürlich könnte ich meinen Testcode in ein Skript einfügen, das ich mit python -i ausführe, aber dies ist eine solche Scratch-Aktivität, dass es beim Öffnen eines Texteditors nicht ganz "über dem Schwellenwert" zu sein scheint :) Was ich bin wirklich sehnsüchtig ist das Ctrl-r Verhalten der Bash-Shell: Um eine Folge von 10 Befehlen nacheinander in Bash auszuführen, muss der Befehl im Verlauf gefunden werden (wiederholt Up oder Ctrl-r für eine Suche - beide arbeiten in der Python-Interpreter-Shell) und drücken dann einfach zehnmal Ctrl-o. Eine meiner Lieblingsfunktionen in der Bash-Shell.

Das Problem ist, dass viele andere Readline-Bindungsfunktionen wie Ctrl-a, Ctrl-e, Ctrl-r und Ctrl-s im Python-Interpreter nicht funktionieren, Ctrl-o jedoch nicht. Ich konnte online keine Verweise darauf finden, obwohl vielleicht die Das Modul readline kann verwendet werden, um diese Funktionalität zur Eingabeaufforderung python hinzuzufügen. Irgendwelche Vorschläge?

Bearbeiten: Ja, ich weiß, dass die Verwendung des interaktiven Interpreters keine Entwicklungsmethode ist, die über einige Zeilen hinaus skaliert! Aber es ist praktisch für kleine Tests, und IMO kann die Interaktivität helfen, herauszufinden, ob eine sich entwickelnde API natürlich und bequem oder zu schwer ist. Beschränken Sie also bitte die Antworten auf die technische Frage, ob Readline-History-Stepping in Python zum Laufen gebracht werden kann, und nicht auf die Nebenmeinung, ob man sich (manchmal) dafür entscheiden sollte oder nicht!

Bearbeiten: Seit dem Posten wurde mir klar, dass ich bereits das Modul readline verwende, damit einige Python-Interpreter-Verlaufsfunktionen funktionieren. Die Strg-O-Bindung an den Befehl operate-and-get-next readline scheint jedoch nicht unterstützt zu werden, selbst wenn ich readline.parse_and_bind("Control-o: operate-and-get-next") in meine PYTHONSTARTUP -Datei eingefügt habe.

2
andybuckley 21 Sept. 2012 im 20:34

4 Antworten

Beste Antwort

Beantwortung meiner eigenen Frage nach einigen Diskussionen über die Liste der Python-Ideen: Trotz widersprüchlicher Informationen in einigen Readline-Dokumentationen scheint die operate-and-get-next -Funktion tatsächlich als Bash-Erweiterung für Readline definiert zu sein, nicht durch Core-Readline.

Aus diesem Grund verhält sich Ctrl-o beim Importieren des Moduls readline in einer Python-Interpretersitzung oder beim Versuch, diese Bindung manuell zu erzwingen, weder standardmäßig wie erhofft: Die Funktion ist in der Readline-Bibliothek nicht vorhanden gebunden.

Eine Google-Suche zeigt https://bugs.launchpad.net/ipython/+bug/382638, auf dem der GNU-Readline-Betreuer Gründe dafür angibt, dass diese Funktion nicht zur Core-Readline hinzufügt, und sagt, dass sie von der aufrufenden Anwendung implementiert werden sollte. Er sagt auch, "seine Implementierung ist nicht kompliziert", obwohl mir nicht klar ist, wie (oder ob es überhaupt möglich ist), dies als reine Python-Erweiterung des Verhaltens des readline -Moduls zu tun.

Nein, dies ist derzeit nicht möglich, es sei denn, die Funktion operate-and-get-next von bash ist explizit im Python-Modul readline oder im Interpreter selbst implementiert.

1
andybuckley 8 Okt. 2012 im 13:15

Dies ist nicht gerade eine Antwort auf Ihre Frage, aber wenn dies Ihr Entwicklungsstil ist, sollten Sie sich DreamPie . Es ist ein GUI-Wrapper für das Python-Terminal, der verschiedene praktische Verknüpfungen bietet. Eine davon ist die Möglichkeit, per Drag & Select über die Interpreter-Anzeige zu ziehen und nur den Code (nicht die Ausgabe) zu kopieren. Sie können diesen Code dann einfügen und erneut ausführen. Ich finde das praktisch für die Art von Workflow, die Sie beschreiben.

0
BrenBarn 7 Okt. 2012 im 21:42

Ich teste Python-Module häufig, während ich sie entwickle, indem ich eine interaktive Python-Eingabeaufforderung in einem Terminal ausführe, mein neues Modul importiere und die Funktionalität teste.

Verwenden Sie dieses Muster nicht mehr und schreiben Sie Ihren Testcode in eine Datei. Dadurch wird Ihr Leben viel einfacher.

  • Egal was passiert, das Ausführen dieser Datei ist weniger problematisch.

  • Wenn Sie die Überprüfungen automatisch durchführen, anstatt die Ergebnisse zu lesen, ist die Überprüfung Ihres Codes schneller und weniger fehleranfällig.

  • Sie können diese Datei speichern, wenn Sie fertig sind, und sie ausführen, wenn Sie Ihren Code oder Ihre Umgebung ändern.

  • Sie können Metriken für die Tests durchführen, z. B. sicherstellen, dass Sie keine Teile Ihres Codes haben, die Sie nicht getestet haben.

Kennen Sie das unittest-Modul?

4
Mike Graham 5 Okt. 2012 im 12:14

Am besten überprüfen Sie dieses Projekt: http://ipython.org

Dies ist ein Beispiel für eine Verlaufssuche mit Strg + R :

enter image description here

BEARBEITEN Wenn Sie debian ausführen oder abgeleitet sind:

sudo apt-get install ipython
0
Gilles Quenot 10 Okt. 2012 im 01:04