5

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

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 行
打印语句 第 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 回答