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

ran*_*guy 9 python preprocessor comments commenting

我的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')
Run Code Online (Sandbox Code Playgroud)

我想#define代码中的这些资源消耗函数.像c等价的东西

#define logging.debug(val)
Run Code Online (Sandbox Code Playgroud)

是的,我知道日志模块日志记录级别机制可用于屏蔽低于设置日志级别的日志记录.但是,我要求一般方法让python解释器跳过功能(即使他们不做太多也需要时间运行)

一个想法是重新定义我想要注释到空函数的函数:

def lazy(*args): pass
logging.debug = lazy
Run Code Online (Sandbox Code Playgroud)

上述想法仍然会调用一个函数,并可能产生无数其他问题

Dav*_*rby 17

Python没有预处理器,尽管您可以通过外部预处理器运行python源以获得相同的效果 - 例如,sed "/logging.debug/d"将删除所有调试日志记录命令.这不是很优雅 - 您最终需要某种构建系统来通过预处理器运行所有模块,并且可能在运行主脚本之前创建已处理的.py文件的新目录树.

或者,如果将所有调试语句放在一个if __debug__:块中,当使用-O(优化)标志运行python时,它们将得到优化.

顺便说一句,我使用dis模块检查了代码,以确保它得到优化.我发现了两者

if __debug__: doStuff()
Run Code Online (Sandbox Code Playgroud)

if 0: doStuff()
Run Code Online (Sandbox Code Playgroud)

是优化的,但是

if False: doStuff()
Run Code Online (Sandbox Code Playgroud)

不是.这是因为False是一个常规的Python对象,你实际上可以这样做:

>>> False = True
>>> if False: print "Illogical, captain"
Illogical, captain
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是一种语言缺陷 - 希望它在Python 3中得到修复.

编辑:

这已在Python 3中修复:分配为True或False 现在提供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         
Run Code Online (Sandbox Code Playgroud)