我有一个我正在研究的python项目,而不是print语句,我调用函数say(),这样我就可以在开发过程中打印信息并在生产过程中记录日志信息。但是,我经常忘记这一点并错误地将print语句放入代码中。反正有没有让python程序读取自己的源代码,如果在函数外面找到任何print语句,则返回exit()吗?
答案 0 :(得分:7)
这可以使用ast
模块完成。以下代码将查找print
语句以及print()
函数的任何调用,以防您在使用print_function
未来的Python 3或Python 2上。
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
此示例的输出为:
喜
第24行打印声明
第26行打印声明
答案 1 :(得分:1)
虽然我不建议这样做,但如果你真的想要,你可以让Python解释器通过重新定义print
语句来抛出错误。
如果使用Python 3,只需将其放在代码的开头/顶部附近:
print = None
如果有print
个语句,则会出现TypeError: 'NoneType' object is not callable
错误。
如果使用Python 2.x,您可以使用另一个answer中建议的想法,以允许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