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