2012-12-13 12 views
7

Ich möchte einen visuellen Debugger erstellen, der den Programmierern hilft, zu sehen, wie Ausdruckauswertung stattfindet (wie Unterausdrücke ausgewertet und durch ihre Werte "ersetzt" werden, so etwas wie Expressionsbewertungsvisualisierer in Excel).Wie durchläuft man den Python-Ausdruck?

Sieht so aus, als könnten Sie diesen Prozess nicht mit Pythons pdb durchgehen, da die feinste Schrittgranularität eine Codezeile ist. Ist es irgendwie möglich, den Python-Bytecode zu durchlaufen? Irgendwelche anderen Ideen, wie man dieses Ziel erreicht?

EDIT: Ich brauche eine leichte Lösung, die auf CPython-Standard-Bibliothek gebaut werden kann.

+0

wäre das nicht so etwas wie pythons c level Debugger [gdb] (http: //wiki.python.org/moin/DebuggingWithGdb)? –

+0

@ X.Jacobs - Ich brauche eine Lösung, die auf CPython Standardverteilung aufgebaut werden kann und es sollte in Windows sowie in OSX und Linux funktionieren. – Aivar

+0

[Debuggen von C/C++ und CPython mit der neuen Python-Erweiterung von GDB 7] (http://misspent.wordpress.com/2012/03/24/debugging-cc-and-cpython-using-gdb-7s-new -python-extension-support /) –

Antwort

1

beitragen konnte ich eine Lösungsidee auch selbst habe - ich konnte den Code Instrument (oder AST) durch alle (Unter-) Umwickeln Ausdrücke in ein Dummy-Methodenaufruf, der nichts weiter tut, als sein Argument zurückzugeben. Z.B.

x = f(sin(x + y)) 

wird

x = dummy(f(dummy(sin(dummy(dummy(x) + dummy(y)))))) 

So kann ich garantierter bin benachrichtigt werden nach jedem subexpression ausgewertet wird und ich erhalte auch die Werte. Ich kann auch zusätzlicher Standort/AST Informationen darüber, welchen Teil des Ausdrucks hinzufügen zur Zeit behandelt wird, zB:

... dummy(x, line=23, col=13, length=1) ... 

Leider erfordert dies mit AST und Kompilierung durcheinander ...

+0

Hallo! Es scheint, dass ich das gleiche Problem wie Sie löse :) Könnten Sie bitte [meine Frage] (http://stackoverflow.com/questions/40639652/tracing-python-expression-evaluation-step-by- Schritt). Es ist ein Kopfgeld offen. Es scheint, dass ich nach einem Teil des Codes suche, den Sie hier beschrieben haben. Ich kann versuchen, in den Code Ihrer Thonny-Software einzutauchen (da ich gerne etwas mit Jupyter interoperieren würde und ich nicht den vollständigen Debugger haben möchte, momentan möchte ich Thonny nicht verwenden), aber ich glaube, Sie werden es tun mach es besser :) –

+0

@ IlyaV.Schurov, der entsprechende Code ist hier https://bitbucket.org/plas/thonny/src/master/thonny/backend.py?at=master&fileviewer=file-view-default, vielleicht Sie kann etwas von dort wiederverwenden. Sie benötigen wahrscheinlich auch https://bitbucket.org/plas/thonny/src/master/thonny/ast_utils.py?at=master&fileviewer=file-view-default, da Python AST nicht genügend (korrekte) Informationen darüber enthält, wo sich jeder befindet Der AST-Knoten befindet sich im Code. – Aivar

+0

Danke! Könnten Sie bitte Ihre Antwort auf [meine Frage] (http://stackoverflow.com/questions/40639652/tracing-python-expression-evaluation-step-by-step) kopieren, damit ich sie als möglichen Kopfgeldsieger betrachten kann? –

1

Mit pdb kann jeder Funktionsaufruf gestartet werden. Für jede andere Anweisung kann pdb die Werte der relevanten Namen in der Zeile ausgeben. Welche zusätzliche Funktionalität suchen Sie, die nicht abgedeckt ist?

Wenn Sie versuchen, Dinge wie ein Listenverständnis zu "betreten", wird das aus einer reinen Python-Perspektive nicht funktionieren, weil es ein einzelner Opcode ist. Irgendwann für jeden Ausdruck müssen Sie Ihren Schülern sagen, und hier geht Python in die C-Implementierung und bewertet diese ... ".

+0

Das Problem liegt vor, wenn mehrere Funktionsaufrufe in einer Zeile stehen. Wenn ich an dieser Zeile den Befehl "step" wähle, dann finde ich mich in einer dieser Funktionen und es ist nicht klar, welche. Wenn Python in alle Funktionen eintrat, konnte ich den Ausdruck im Voraus analysieren, um herauszufinden, in welcher Reihenfolge die Funktionsaufrufe ausgewertet werden. Dies würde mir helfen, den Überblick darüber zu behalten, welcher Teilausdruck momentan bewertet werden muss. Aber leider tritt Python nicht in eingebaute/C-Funktionen ein und syntaktisch sind diese Funktionsaufrufe von Aufrufen zu benutzerdefinierten Funktionen nicht unterscheidbar. – Aivar

+0

Sie können alle Funktionen aufrufen, solange Sie 's' gedrückt halten. Und deine Beschwerde, dass "Python nicht in eingebaute/C-Funktionen einsteigt", ist genau mein Punkt: Irgendwann steige ich in C ab und benötige einen Weg, damit umzugehen. Das könnte gdb oder etwas ganz anderes sein, aber es wird _allal_ passieren. – jknupp

+0

Ich möchte nicht in C-Funktionen einsteigen, ich möchte nur wissen, wo ich in Bezug auf den ursprünglichen Ausdruck bin, aber Python sagt mir das nicht (siehe meine andere Frage: http://stackoverflow.com/questions/ 13952022 /). Ich konnte die Anzahl der Funktionseinträge zählen und die Position selbst verfolgen, aber die Tatsache, dass einige (unbekannte) Funktionsaufrufe vom Tracer ignoriert werden, bricht mein Zählsystem. – Aivar

1

Sie sollten reinteract Check-out, es ist ziemlich einfach ist und Sie zu diesem

2

Sie pudb versucht haben? http://pypi.python.org/pypi/pudb auf einem Debian-like: apt-get install python-pudb

Es zu pdb legt, so dass ich denke, das ist nicht das, was ich ist gesucht haben. Zumindest, wenn man in einer Funktion Schritt, scheint es klar, welche Sie sind in

für den Unterricht Studenten, etwas, das Sie sein könnte.

  • erste, schreiben die Programmvariablen, Komponieren mit mehreren Schritten,
  • debug dieses Programm mit dem richtigen Python-Debugger (pdb, winpdb, pudb ...),
  • dann, sobald der Prozess gut verstanden wird, loswerden temporäre Variablen, indem Sie den Code in weniger kombinieren Linien, allmählich, bis Sie zu dem endgültigen Code kommen.

Ich weiß, es ist weit, perfekt zu sein, aber das ist das Beste, was ich mir vorstellen kann, im Moment.

Verwandte Themen