相当于 '#define func() ' 的 python 或如何在 python 中注释掉函数调用

标签 python preprocessor comments

我的 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/

相关文章:

python - 同时使用 urllib2.urlopen() 进行多个请求

python - 类型错误 : not all arguments converted during string formatting when inserting data into db

python - python中的屏幕录像机

Java APT 和 __LINE__

assembly - 为什么这里需要 C 宏中的 "##"以及预处理的 MIPS 汇编中的分号意味着什么?

asp.net - 注释掉未使用的代码是否会以任何方式,形状或形式提高我的页面的性能?

comments - 为什么在解释语言中 # 通常会引入注释?

python - 中断并重新启动写操作

c - C文件的部分预处理

python - Python中的中线评论?