我在游戏引擎中运行Python 2.4,我希望能够在需要时关闭所有打印件.例如,我想打开调试版本的打印件,然后关闭发布版本.它必须尽可能透明.
我在引擎的C代码中解决这个问题的方法是printf
在vararg
宏中使用该函数,并定义在发布版本中不执行任何操作.
这是我目前的解决方案:
DebugPrints = True def PRINT (*args): global DebugPrints if DebugPrints: string = "" for arg in args: string += " " + str(arg) print string
它可以轻松切换打印输出,但可能有更好的格式化字符串的方法.我的主要问题是,这实际上是为程序添加了更多的函数调用.
我想知道你是否可以对print关键字如何工作做些什么?
是的,你可以分配sys.stdout
你想要的任何东西.用一个write
什么都不做的方法创建一个小类:
class DevNull(object): def write(self, arg): pass import sys sys.stdout = DevNull() print "this goes to nirvana!"
使用相同的技术,您还可以通过设置sys.stdout
打开的文件对象将打印件记录到文件中.
我知道答案已被标记为正确,但Python有一个调试标志,可提供更清晰的解决方案.你这样使用它:
if __debug__: print "whoa"
如果使用-O或-OO调用Python(就像通常用于发布版本一样),__debug__
则设置为False
.更好的是,这__debug__
是口译员的一个特例; 它实际上会在写入pyc/pyo
文件时删除该代码,从而使得生成的代码更小/更快.请注意,您无法为其分配值__debug__
,因此它完全基于这些命令行参数.
该记录模块是"最好"的方式.虽然我经常只使用一些简单的像..
class MyLogger: def _displayMessage(self, message, level = None): # This can be modified easily if level is not None: print "[%s] %s" % (level, message else: print "[default] %s" % (message) def debug(self, message): self._displayMessage(message, level = "debug") def info(self, message): self._displayMessage(message, level = "info") log = MyLogger() log.info("test")