Wie kann ich die Debugging-Ausgabe in Mathematica ausblenden?

1494
Anonimous

Ich möchte alle Ausgaben, die mit dem Befehl Drucken erstellt wurden, aus der in module .m.

Genauer gesagt folgt das Problem:

Ich habe ein Modul, das eine bestimmte Aufgabe löst (Es ist nicht notwendig, die Aufgabe zu kennen, um die Frage zu verstehen). Ich verwende den Befehl Drucken innerhalb des Moduls, um den Auswertungsprozess auszugeben. Es ist nützlich für das Debuggen, jedoch nicht für die Verwendung (alle inneren Ausgaben müssen ausgeblendet werden, wenn der Benutzer eine im Modul deklarierte Funktion aufruft).

Also, in jeder stabilen Version des Moduls muss ich Kommentare ( * *) einfügen und sie für das gebugging löschen. Ich nehme an, dass dieser Weg unzivilisiert ist und Mathematica einen regelmäßigen Weg haben sollte, innere Ausgaben zu verbergen.

Zum Beispiel haben wir 3 Dateien im selben Verzeichnis. Können Sie mir eine einfache Möglichkeit vorschlagen, alle Ausgaben standardmäßig auszublenden und alle Ausgaben im Debugging-Modus zu drucken?

modul.m:

f[x_]:=Module[, y=Cos[x]*Sin[x]; Print["modul.m: y=",y]; Return[y]]; 

debugging.nb:

SetDirectory[NotebookDirectory[]]; << modul.m; x=10; f[x] (* print all inner output generated while f is evaluating*) x=20; f[x](* print all inner output generated while f is evaluating*) 

application.nb:

<< modul.m y=f[10]+f[20]; (* Hide all outputs of f during evaluation. Command ; doesn't work for this issue. *)  
2

1 Antwort auf die Frage

4
Szabolcs

The short answer to this is that a simple Print[] is not a good way to debug a large package. It is not possible to turn it off (in a robust way) only for your package, but not in other places (it can be disabled globally, the simplest way being Print; Unprotect[Print]; Print = Null &, but this will severely annoy your users)

For much better ways to emit debug messages, and turn them off, see here:

https://stackoverflow.com/questions/8698754/message-generation-in-mathematica

I'll summarize Brett Champion and my own answers from there, as personally (and subjectively) I consider those the best solutions, but please read the full thread there.


Brett Champion's answer:

Use a custom symbol for debug messages(just like your package functions, you may want to put it in a separate context to avoid collisions), like this:

... debugPrint[expr] ... 

Then define a PrintDebug function like this:

Attributes[PrintDebug]= PrintDebug[expr_] := Block[, expr] 

Any code wrapped in PrintDebug will print messages. If there's no PrintDebug wrapper, message printing is disabled.

MyFunction[1,2,3] // PrintDebug 

Alternately you may set a value to debugPrint globally to enable message printing for everything or just do $Pre = PrintDebug.


My answer:

We can use the built-in Message functionality for debugging too:

debugPrint::msg = "Debug message: `1`"; debugPrint[msg_] := Message[debugPrint::msg, msg] 

Use the function like this:

debugPrint["hello"] 

Turn off or on messages like this:

Off[debugPrint::msg] On[debugPrint::msg] 
Ich danke Ihnen sehr für Ihre Antwort! Ich wählte die erste Lösung (von Brett Champion), da sie mit mehreren Argumenten in debugPrint `debugPrint [" modul.m: y = ", y] arbeiten kann; debugPrint [" modul.m: y = ", y," z = " , z]; `Aber die Idee, Message zu verwenden, sieht gut aus. Ich wünschte, es wäre möglich, debugPrint mit einer im April unbekannten Anzahl von Argumenten zu definieren. Anonimous vor 12 Jahren 0
@Anonimous Wenn Sie die `Message`-Version von` debugPrint` verwenden, können Sie entweder alles in eine Liste aufnehmen, bevor Sie sie übergeben, `debugPrint []` ", oder wir können so etwas wie` debugPrint 'tun [args__]: = Message [debugPrint :: msg, StringJoin [ToString / @ ]] `` `` `emulieren '(im Gegensatz zu` `` `` `` `` `` `' '' ') !) oder `debugPrint [args__]: = Nachricht [debugPrint :: msg, StringJoin [Riffle [ToString / @ ,", "]]]`, um durch Kommas getrennte Argumente zu erhalten. Das Beibehalten der Formatierung ist ebenfalls möglich, aber es ist fortgeschrittener, so dass ich nicht weiter darauf eingehen werde. Szabolcs vor 12 Jahren 0
@Anonimous Ich habe gerade erkannt, dass `StringForm` ineinander verschachtelt werden kann. Sie können also auch die auf Nachrichten basierende` debugPrint`-Methode verwenden: `` `debugPrint [" StringForm ["x =` `, y =` `", x, y]] `` `(oder integrieren Sie` StringForm` direkt in die Funktion) Szabolcs vor 12 Jahren 0