我的 python 代码与许多用于(调试|分析|跟踪等)的函数调用交织在一起 例如:
import logging
logging.root.setLevel(logging.DEBUG)
logging.debug('hello')
j = 0
for i in range(10):
j += i
logging.debug('i %d j %d' % (i,j))
print(j)
logging.debug('bye')
我想在代码之外#define 这些资源消耗函数。类似于 c 等价物
#define logging.debug(val)
是的,我知道日志记录模块日志记录级别机制可用于屏蔽低于设置日志级别的日志记录。但是,我要求一种通用的方法让 python 解释器跳过函数(即使它们不做太多也需要时间来运行)
一个想法是将我想注释掉的函数重新定义为空函数:
def lazy(*args): pass
logging.debug = lazy
上面的想法仍然调用了一个函数,并且可能会产生无数其他问题
最佳答案
Python 没有预处理器,尽管您可以通过外部预处理器运行 Python 源代码以获得相同的效果 - 例如sed "/logging.debug/d"
将删除所有调试日志命令。虽然这不是很优雅 - 您最终将需要某种构建系统来通过预处理器运行所有模块,并且可能在运行主脚本之前创建已处理的 .py 文件的新目录树。
或者,如果您将所有调试语句放在 if __debug__:
block 中,当使用 -O(优化)标志运行 python 时,它们将被优化掉。
顺便说一句,我用 dis 模块检查了代码,以确保它确实得到了优化。我发现两者都是
if __debug__: doStuff()
和
if 0: doStuff()
被优化了,但是
if False: doStuff()
不是。这是因为 False 是一个常规的 Python 对象,实际上您可以这样做:
>>> False = True
>>> if False: print "Illogical, captain"
Illogical, captain
这在我看来是语言中的一个缺陷——希望它在 Python 3 中得到修复。
编辑:
这在 Python 3 中已修复:分配给 True 或 False now gives a SyntaxError .
由于 True 和 False 在 Python 3 中是常量,这意味着现在优化了 if False: doStuff()
:
>>> def f():
... if False: print( "illogical")
...
>>> dis.dis(f)
2 0 LOAD_CONST 0 (None)
3 RETURN_VALUE
关于相当于 '#define func() ' 的 python 或如何在 python 中注释掉函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2006190/