防止打印状态的自扫描代码

2024-04-19 14:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python项目,我正在工作,通过调用函数say()来代替print语句,这样我可以在开发过程中打印信息,并在生产过程中记录信息。但是,我经常忘记这一点,错误地将print语句放入代码中。有没有办法让python程序读取它自己的源代码,如果它在函数say()之外发现任何print语句,就退出()呢?你知道吗


Tags: 项目函数代码程序信息源代码过程错误
2条回答

这可以使用^{}模块来完成。如果您使用的是具有print_function未来的python3或python2,那么下面的代码将找到对print语句和print()函数的任何调用。你知道吗

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
print statement on line 24
print statement on line 26

虽然我不建议这样做,但是如果您真的想这样做,可以让Python解释器通过重新定义print语句抛出一个错误。你知道吗

如果使用Python3,只需将其放在代码的开头/顶部:

print = None

如果有任何print语句,您将得到一个TypeError: 'NoneType' object is not callable错误。你知道吗

如果使用python2.x,您可以使用另一个answer中建议的思想来允许python2.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

相关问题 更多 >