gpt4 book ai didi

python - Python中如何防止部分任意代码被编译?

转载 作者:行者123 更新时间:2023-12-01 06:00:34 25 4
gpt4 key购买 nike

根据python documentation如果使用 -O 键编译代码,则 assert 语句不会包含在代码中。我想知道是否可以用任意一段代码来模拟这种行为?

例如,如果我有一个在执行过程中被大量调用的记录器,我可以从消除 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

部分,在没有任何附加注释的情况下也很容易检测到这些部分。

关于python - Python中如何防止部分任意代码被编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10661578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com