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
追加のコメントがなくても、それらを検出するのは非常に簡単です。
# 記号が不要なコードをコメントアウトしてみませんか?