<p>由于Python是一种解释语言,它不能在自己的代码中跳转。但是你不需要一个“特殊的工具”来剥离你的部分代码使用Python!你知道吗</p>
<p>这是一个最小的例子。您可能希望将<code>strip_debug()</code>函数放在<code>__init__.py</code>中,让它处理模块列表。另外,您可能还需要添加一些额外的检查,以确保用户确实希望<em>修改</em>代码,而不仅仅是<em>运行</em>它。也许,使用命令行选项<code> purge</code>会更好。然后,您可以复制一个库并运行一次</p>
<pre><code>python __init__.py purge
</code></pre>
<p>在发布库之前,或者让用户自己发布。你知道吗</p>
<pre><code>#!/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
</code></pre>
<p>执行之后,这个文件将只包含<code>foo()</code>函数的函数代码。我用了特别的评论</p>
<pre><code># BEGIN DEBUG
</code></pre>
<p>以及</p>
<pre><code># END DEBUG
</code></pre>
<p>在这个例子中,它允许剥离任意代码,但如果它只是为了删除</p>
<pre><code>if DEBUG:
# stuff
</code></pre>
<p>如果没有任何附加注释,也很容易检测到这些内容。你知道吗</p>