根据python 文档 assert
,如果使用-O
密钥编译,代码中不包含语句。我想知道是否可以用任意一段代码来模拟这种行为?
例如,如果我有一个在执行期间被大量调用的记录器,我可以从消除if DEBUG: ...
与它们相关联的所有代码的语句中受益。
根据python 文档 assert
,如果使用-O
密钥编译,代码中不包含语句。我想知道是否可以用任意一段代码来模拟这种行为?
例如,如果我有一个在执行期间被大量调用的记录器,我可以从消除if DEBUG: ...
与它们相关联的所有代码的语句中受益。
由于 Python 是一种解释型语言,它不能在自己的代码中跳跃。但是您不需要“特殊工具”来剥离部分代码——使用 Python 吧!
这是一个最小的例子。您可能希望将strip_debug()
函数放入您的__init__.py
并让它处理模块列表。此外,您可能想要添加一些额外的检查,以确认用户是否真的想要修改代码,而不仅仅是运行它。可能,使用命令行选项--purge
会很好。然后,您可以复制您的库并运行一次
python __init__.py --purge
在您发布库之前或将其留给您的用户这样做。
#!/usr/bin/env python3.2
# BEGIN DEBUG
def _strip_debug():
"""
Generates an optimized version of its own code stripping off all debugging
code.
"""
import os
import re
import shutil
import sys
import tempfile
begin_debug = re.compile("^\s*#+\s*BEGIN\s+DEBUG\s*$")
end_debug = re.compile("^\s*#+\s*END\s+DEBUG\s*$")
tmp = None
debug = False
try:
tmp = tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False)
with open(sys.argv[0]) as my_code:
for line in my_code:
if begin_debug.match(line):
debug = True
continue
elif end_debug.match(line):
debug = False
continue
else:
if not debug:
tmp.write(line)
tmp.close()
shutil.copy(tmp.name, sys.argv[0])
finally:
os.unlink(tmp.name)
# END DEBUG
def foo(bar, baz):
"""
Do something weired with bar and baz.
"""
# BEGIN DEBUG
if DEBUG:
print("bar = {}".format(bar))
print("baz = {}".format(baz))
# END DEBUG
return bar + baz
# BEGIN DEBUG
if __name__ == "__main__":
_strip_debug()
# END DEBUG
执行后,该文件将只包含函数的功能代码foo()
。我用了特别评论
# BEGIN DEBUG
和
# END DEBUG
在这个例子中,它允许剥离任意代码,但如果它只是为了删除
if DEBUG:
# stuff
部分,也很容易检测到那些没有任何附加注释的部分。
你为什么不把你不想要#符号的代码注释掉呢?