1

Pythonのドキュメント によると、キーassertでコンパイルされている場合、ステートメントはコードに含まれていません。-Oこの動作を任意のコードでエミュレートできるかどうか疑問に思っていますか?

たとえば、実行中に頻繁に呼び出されるロガーがある場合、if DEBUG: ...すべてのコードが関連付けられたステートメントを削除することでメリットが得られます。

4

2 に答える 2

2

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

追加のコメントがなくても、それらを検出するのは非常に簡単です。

于 2012-05-19T14:01:00.110 に答える
0

# 記号が不要なコードをコメントアウトしてみませんか?

于 2012-05-19T01:31:20.693 に答える