5

私が取り組んでいる python プロジェクトでは、print ステートメントの代わりに関数 say() を呼び出して、開発中に情報を出力し、生産中に情報を記録することができます。しかし、私はよくこれを忘れて誤って print ステートメントをコードに入れています。とにかくpythonプログラムに独自のソースを読み込ませ、関数say()の外に印刷ステートメントが見つかった場合はexit()をさせることはありますか?

4

2 に答える 2

7

astこれは、モジュールを使用して実行できます。次のコードは、将来的に Python 3 または Python 2 を使用している場合に備えて、printステートメントの呼び出しと関数の呼び出しを検出します。print()print_function

import ast

class PrintFinder(ast.NodeVisitor):
    def __init__(self):
        self.prints_found = []

    def visit_Print(self, node):
        self.prints_found.append(node)
        super(PrintFinder, self).generic_visit(node)

    def visit_Call(self, node):
        if getattr(node.func, 'id', None) == 'print':
            self.prints_found.append(node)
        super(PrintFinder, self).generic_visit(node)


def find_print_statements(filename):
    with open(filename, 'r') as f:
        tree = ast.parse(f.read())
    parser = PrintFinder()
    parser.visit(tree)
    return parser.prints_found

print 'hi'
for node in find_print_statements(__file__):
    print 'print statement on line %d' % node.lineno

この例の出力は次のとおりです。

hi
24 行目の
print ステートメント 26 行目の print ステートメント

于 2013-01-18T01:18:27.063 に答える
1

これを行うことはお勧めしませんが、本当にしたい場合は、printステートメントを再定義することで Python インタープリターにエラーをスローさせることができます。

Python 3 を使用している場合は、これをコードの最初/一番上に置くだけです。

print = None

printステートメントがある場合は、TypeError: 'NoneType' object is not callableエラーが発生します。

Python 2.x を使用している場合は、別の回答で提案されているアイデアを使用して、Python 2.x でオーバーライド可能な print ステートメントを使用できるようにすることができます。

from __future__ import print_function
print = None

これをsay()関数と組み合わせると、次のようなことができます。

print_original = print
print = None

def say(data):
    print = print_original 
    # Your current `say()` code here, such as:
    print(data)  # Could just use `print_original` instead.
    # Redefine print to make the statement inaccessible outside this function.
    print = None
于 2013-01-18T01:15:28.817 に答える