我有一个我正在研究的python项目,而不是打印语句,我调用了一个函数say(),这样我就可以在开发过程中打印信息并在生产过程中记录信息。但是,我经常忘记这一点,并错误地将打印语句放入代码中。无论如何让python程序读取它自己的源代码,如果它在函数say()之外找到任何打印语句,则退出()?
问问题
109 次
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 行
打印语句 第 26行打印语句
于 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 具有可覆盖的打印语句。
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 回答