2010-05-11 1 views
11

ich mich Debuggen „print“ -Aussagen Hinzufügen finden sehr oft - Sachen wie diese:Drucken von Variablennamen und -inhalten als Debugging-Tool; Suche Emacs/Verknüpfung Python

print("a_variable_name: %s" % a_variable_name) 

Wie alles, was Sie tun? Bin ich neurotisch bei dem Versuch, einen Weg zu finden, dies zu optimieren? Ich arbeite vielleicht an einer Funktion und lege ein halbes Dutzend dieser Zeilen ein, finde heraus, warum es nicht funktioniert, und schneide sie dann wieder aus.

Haben Sie eine effiziente Methode entwickelt?

Ich codiere Python in Emacs.

+0

Nach all den Jahren und wieder mit dieser Frage zu stolpern, habe ich es endlich verstanden, was wir immer gebraucht haben, waren syntaktische Makros! dh. in [# julia-lang] (http://stackoverflow.com/questions/tagged/julia-lang): '@show foo = 1.0 + 3im/2' Drucke; 'foo = 1,0 + (3im)/2 = 1,0 + 1.5im', wobei '@ show' ein Makro ist und verwendet werden kann, um einen beliebigen Ausdruck zu ändern (in Julia ist alles ein Ausdruck), können Sie den aus der Makroerweiterung erzeugten Code hier sehen: https://git.io/vgDch I fand diese Implementierung von syntaktischen Makros für Python: https://github.com/lihaoyi/macropy aber Julia Metaprogrammieren ist das Beste! – SalchiPapa

Antwort

8

Manchmal ist ein Debugger großartig, aber manchmal ist die Verwendung von Druckanweisungen schneller und einfacher einzurichten und wiederholt zu verwenden.

In utils_debug.py:

import inspect  
def pv(name): 
    record=inspect.getouterframes(inspect.currentframe())[1] 
    frame=record[0] 
    val=eval(name,frame.f_globals,frame.f_locals) 
    print('{0}: {1}'.format(name, val)) 

nur Dies kann für das Debuggen mit CPython (da nicht alle Pythons implementieren inspect.currentframe und inspect.getouterframes), aber ich finde dies nützlich für eine Senkung auf Typisierung geeignet sein

Dann in Ihrem script.py:

from utils_debug import pv 

Mit dieser Einrichtung können Sie ersetzen

print("a_variable_name: %s' % a_variable_name) 

mit

pv('a_variable_name') 

Hinweis, daß das Argument zu pv sollte die Zeichenfolge (Variablennamen oder Ausdruck), nicht der Wert selbst.

Um diese Linien mit Emacs zu entfernen, Sie

C-x ( # start keyboard macro 
C-s pv(' 
C-a 
C-k  # change this to M-; if you just want to comment out the pv call 
C-x) # end keyboard macro 

Dann könnten Sie das Makro einmal mit C-x e oder tausendmal mit C-u 1000 C-x e

Natürlich muss man vorsichtig sein, dass Sie anrufen möchte in der Tat alle Zeilen entfernen, die pv(' enthalten.

+0

Ihr Weg mag nicht sehr elegant sein, aber ich finde es ziemlich nützlich, mit der gleichen Notwendigkeit wie Schof, das ist überflüssige Tipparbeit vermeiden Beim Debuggen von Variablen –

+0

Ich weiß, dass dies eine alte Antwort ist, also könnten sich die Dinge geändert haben. Aber ich bin mit Google darüber gestolpert, also werde ich das hier lassen. Jetzt können Sie direkt 'frame = inspect.currentframe(). F_back' machen, was ein bisschen schöner und klarer ist :) – Santiago

1

Tun Sie das nicht. Verwenden Sie stattdessen einen anständigen Debugger. Am einfachsten ist es, IPython zu verwenden und entweder auf eine Ausnahme zu warten (der Debugger wird automatisch gestartet) oder eine zu provozieren, indem Sie eine ungültige Anweisung (z. B. 1/0) in dem Teil des Codes ausführen, den Sie untersuchen möchten .

+0

+1 für das richtige Werkzeug, er versucht, einen Nagel mit einem Schweizer Taschenmesser zu hämmern –

Verwandte Themen