如何隐藏 Mathematica 中的调试输出?

如何隐藏 Mathematica 中的调试输出?

我想隐藏由打印命令从用户定义的函数创建的所有输出module .m

更准确地说,问题如下:

我有一个模块可以解决一些特定的任务(理解问题并不需要知道任务)。我使用模块内的 Print 命令来输出评估过程。它对于调试很有用,但对于使用却没有用(当用户调用模块中声明的函数时,所有内部输出都必须隐藏)。

因此,在模块的每个稳定版本中,我都必须添加注释(* *)并删除它们以进行调试。我认为这种方式是不文明的,Mathematica 应该有一种常规方法来隐藏内部输出。

例如,我们在同一个目录中有 3 个文件。您能否建议我一种简单的方法,如何默认隐藏所有输出并在调试模式下打印所有输出?

modul.m

f[x_]:=Module[{y}, 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. *) 

答案1

简短的回答是,简单方法Print[]不是调试大型程序包的好方法。不可能(以一种稳健的方式)关闭它仅有的适用于您的包裹,但不适用于其他地方(它被全局禁用,最简单的方法是Print; Unprotect[Print]; Print = Null &,但这会严重惹恼你的用户)

有关发出调试消息并将其关闭的更好的方法,请参见此处:

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

我将总结 Brett Champion 和我自己的答案,因为我个人(和主观)认为这些是最好的解决方案,但请阅读那里的完整帖子。


Brett Champion 的回答:

使用自定义符号表示调试消息(就像您的包函数一样,您可能希望将其放在单独的上下文中以避免冲突),如下所示:

...
debugPrint[expr]
...

然后定义一个PrintDebug这样的函数:

Attributes[PrintDebug]={HoldAll}

PrintDebug[expr_] := Block[{debugPrint = Print}, expr]

包装的任何代码PrintDebug都会打印消息。如果没有PrintDebug包装器,则禁用消息打印。

MyFunction[1,2,3] // PrintDebug

或者,您可以全局设置一个值来debugPrint为所有内容启用消息打印,或者只执行$Pre = PrintDebug


我的答案:

我们也可以使用内置Message功能进行调试:

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

使用如下函数:

debugPrint["hello"]

关闭或打开这样的消息:

Off[debugPrint::msg]

On[debugPrint::msg]

相关内容