标记Python代码中的“print”语句

16 投票
4 回答
8961 浏览
提问于 2025-04-18 16:52

我不想在我们的Python模块里看到“print”语句,因为我们会使用一个日志记录工具。

我正在尝试生成一个脚本,用来检查模块是否符合pylint的标准。

不过,目前pylint并没有把这个当作警告或错误来处理。

我想要把“print”调用检测为错误或警告,以符合我们内部的Python编程标准。

我该怎么做呢?

4 个回答

0

并不是完美的:像 'print_something()' 这样的代码也会被检测到。不过大部分情况应该都能被抓住:

import os
import sys

for root, dirs, files in os.walk(sys.argv[1]):
    dirs.sort()
    for file in files:
        file=os.path.join(root, file)
        for i, line in enumerate(open(file)):
            line=line.strip()
            if line.startswith('print'):
                print file, i, line
2

还有一个叫做 Ruff 的工具,它实现了和 flake8-print 规则 一样的功能。

只需要用一个简单的一行文件。

print("Hello print!")

通过选择 T 规则,可以快速用 ruff 检查代码中的打印语句。

(venv) PS G:\Testing> ruff test.py --select T
test.py:1:1: T201 `print` found
Found 1 error.

如果想要更永久地启用这些规则,可以 查看如何配置 ruff

10

如果因为某些原因你不想使用@alecxe建议的flake8-print,你可以自己动手用ast模块来实现。这个模块利用了Python的编译器来解析文件,这样你就可以可靠地找到print语句,而不仅仅是那些以print开头的行。

代码:

import ast

with open('blah.py') as fin:
    parsed = ast.parse(fin.read())

for node in ast.walk(parsed):
    if isinstance(node, ast.Print):
        print 'print at line {} col {}'.format(node.lineno, node.col_offset)

blah.py:

def print_test():
    print 'hello'

print 'goodbye'

输出:

print at line 4 col 0
print at line 2 col 1

如果你想浏览一个文件夹或子文件夹,可以使用os.walkos.listdir或者其他更合适的方法。

17

flake8 有一个专门的插件叫 flake8-print,可以用来完成特定的任务:

flake8-print

用于检查 Python 文件中的打印语句。

演示:

$ cat test.py
s = "test"
print s

$ flake8 test.py
test.py:2:1: T001 print statement found.

撰写回答