PyLint:好的、坏的和丑陋的

充分利用 PyLint。
1 位读者喜欢这篇文章。
Python programming language logo with question marks

Opensource.com

热门观点:PyLint 实际上很好!

“PyLint 可以拯救你的生命” 是一种夸张,但没有你想象的那么夸张!PyLint 可以让你远离真正难以找到和复杂的错误。最坏的情况,它可以节省你一次测试运行的时间。最好的情况,它可以帮助你避免复杂的生产错误。

好的方面

我很惭愧地说这有多么常见。命名测试总是很奇怪:没有人关心名称,而且通常找不到自然的名称。例如,看看这段代码

def test_add_small():
    # Math, am I right?
    assert 1 + 1 == 3
    
def test_add_large():
    assert 5 + 6 == 11
    
def test_add_small():
    assert 1 + 10 == 11

测试有效

collected 2 items                                                                         
test.py .. 
2 passed 

但这里的关键是:如果你覆盖了一个名称,测试基础设施会愉快地跳过该测试!

实际上,这些文件可能有数百行长,并且添加新测试的人可能没有意识到所有名称。除非有人仔细查看测试输出,否则一切看起来都很好。

最糟糕的是,添加覆盖测试被覆盖测试的破坏以及导致生产环境中的问题可能相隔数天、数月甚至数年。

PyLint 发现了它

但就像一位好朋友一样,PyLint 在那里支持你。

test.py:8:0: E0102: function already defined line 1
     (function-redefined)

坏的方面

就像 90 年代的情景喜剧一样,你越深入了解 PyLint,它就变得越有问题。对于库存建模程序来说,这完全是合理的代码

"""Inventory abstractions"""

import attrs

@attrs.define
class Laptop:
    """A laptop"""
    ident: str
    cpu: str

似乎 PyLint 有自己的观点(可能是在 90 年代形成的),并且不害怕将这些观点陈述为事实


$ pylint laptop.py | sed -n '/^laptop/s/[^ ]*: //p'
R0903: Too few public methods (0/2) (too-few-public-methods)

丑陋的方面

有没有想过将自己未经审查的观点添加到数百万用户使用的工具中?PyLint 每月有 1200 万次下载。

“如果检查过于挑剔,人们只会禁用整个检查。”——PyLint 问题 6987,2022 年 7 月 3 日

它对于添加一个可能存在许多误报的测试所采取的态度是……“嗯。”

使其为你工作

PyLint 不错,但你需要小心地与其交互。以下是我推荐的三件事,让 PyLint 为你工作。

1. 固定版本

固定你使用的 PyLint 版本,以避免任何意外!

在你的 .toml 文件中

[project.optional-dependencies]
pylint = ["pylint"]

在你的代码中

from unittest import mock

这与这样的代码相对应

# noxfile.py
...
@nox.session(python=VERSIONS[-1])
def refresh_deps(session):
    """Refresh the requirements-*.txt files"""
    session.install("pip-tools")
    for deps in [..., "pylint"]:
        session.run(
            "pip-compile",
            "--extra",
            deps,
            "pyproject.toml",
            "--output-file",
            f"requirements-{deps}.txt",
        )

2. 默认拒绝

禁用所有检查。然后启用你认为具有高价值误报率的检查。(不仅仅是漏报误报率!)

# noxfile.py
...
@nox.session(python="3.10")
def lint(session):
    files = ["src/", "noxfile.py"]
    session.install("-r", "requirements-pylint.txt")
    session.install("-e", ".")
    session.run(
        "pylint",
        "--disable=all",
        *(f"--enable={checker}" for checker in checkers)
        "src",
    )

3. 检查器

这些是我喜欢的一些。在项目中强制执行一致性,避免一些明显的错误。

checkers = [
    "missing-class-docstring",
    "missing-function-docstring",
    "missing-module-docstring",
    "function-redefined",
]

使用 PyLint

你可以只使用 PyLint 的优点。在 CI 中运行它以保持一致性,并使用最高价值的检查器。

抛弃缺点:默认拒绝检查器。

避免丑陋的方面:固定版本以避免意外。

标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
自 1998 年以来,Moshe 一直参与 Linux 社区,帮助举办 Linux “安装聚会”。自 1999 年以来,他一直在编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 自这些术语出现之前就一直是 DevOps/SRE,他非常关心软件可靠性、构建可重复性以及其他此类事情。

1 条评论

学到了新的主题,谢谢

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.