我想隐藏由打印命令从用户定义的函数创建的所有输出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]