自扫描代码以防止打印语句

时间:2013-01-18 01:01:49

标签: python

我有一个我正在研究的python项目,而不是print语句,我调用函数say(),这样我就可以在开发过程中打印信息并在生产过程中记录日志信息。但是,我经常忘记这一点并错误地将print语句放入代码中。反正有没有让python程序读取自己的源代码,如果在函数外面找到任何print语句,则返回exit()吗?

2 个答案:

答案 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