refurb - 用于翻新和现代化 Python 代码库的工具

Created at: 2022-07-27 12:13:51
Language: Python
License: GPL-3.0

翻新

用于翻新和现代化Python代码库的工具。

# main.py

for filename in ["file1.txt", "file2.txt"]:
    with open(filename) as f:
        contents = f.read()

    lines = contents.splitlines()

    for line in lines:
        if not line or line.startswith("# ") or line.startswith("// "):
            continue

        for word in line.split():
            print(f"[{word}]", end="")

        print("")

运行:

$ refurb main.py
main.py:3:17 [FURB109]: Use `in (x, y, z)` instead of `in [x, y, z]`
main.py:4:5 [FURB101]: Use `y = Path(x).read_text()` instead of `with open(x, ...) as f: y = f.read()`
main.py:10:40 [FURB102]: Replace `x.startswith(y) or x.startswith(z)` with `x.startswith((y, z))`
main.py:16:9 [FURB105]: Use `print() instead of `print("")`

安装

在安装之前,建议你设置一个虚拟环境

$ pip3 install refurb
$ refurb file.py folder/

注意:翻新仅支持蟒蛇 3.10。它可以检查Python 3.6代码及更高版本,但Refurb本身必须通过Python 3.10运行。

检查说明

你可以使用 ,其中 是你尝试查找的错误代码。例如:

refurb --explain FURB123
FURB123

$ refurb --explain FURB123
Don't cast a variable or literal if it is already of that type. For
example:

Bad:

```
name = str("bob")
num = int(123)
```

Good:

```
name = "bob"
num = 123
```

忽略错误

用于忽略错误 123。错误代码可以采用 或 的形式。此标志可以重复。

--ignore 123
FURB123
123

前缀表示这是一个内置错误。前缀是可选的,但对于所有其他错误(即 ),前缀是必需的。

FURB
FURB
ABC123

你还可以使用内联注释来禁用错误:

x = int(0)  # noqa: FURB123
y = list()  # noqa

此处,专门忽略该行的 FURB123 错误,并忽略该行上的所有错误。

noqa: FURB123
noqa

配置翻新

除了命令行参数之外,还可以在文件中添加设置。例如,以下命令行参数:

pyproject.toml

refurb file.py --ignore 100 --load some_module --quiet

对应于文件中的以下内容:

pyproject.toml

[tool.refurb]
ignore = [100]
load = ["some_module"]
quiet = true

现在,你需要键入的就是 !提供命令行参数将覆盖配置文件中的任何现有设置。

refurb file.py

使用翻新
pre-commit

你可以通过将以下内容添加到文件中来将 Refurb 与预提交结合使用:

.pre-commit-config.yaml

  - repo: https://github.com/dosisod/refurb
    rev: REVISION
    hooks:
      - id: refurb

替换为你选择的版本或 SHA(或将其留空以查找最新的版本或 SHA)。

REVISION
pre-commit

插件

为翻新安装插件非常容易:

$ pip3 install refurb-plugin-example

其中 是插件的名称。翻新将自动加载任何已安装的插件。

refurb-plugin-example

要制作自己的翻新插件,请参阅翻新插件示例存储库以获取更多信息。

写你自己的支票

如果你想扩展Refub,但不想做一个完整的插件,你可以用命令轻松创建一个一次性的检查文件。

refurb gen

请注意,此命令使用模糊查找器来获取用户输入,因此你需要先安装 fzf,然后再继续。

fzf

以下是使用命令创建新检查的基本概述:

refurb gen

  1. 首先选择要接受的节点类型
  2. 然后键入要保存自动生成的文件的位置
  3. 将代码添加到新文件

要了解需要添加到检查中的内容,请使用该标志查看给定文件的 AST 表示形式(即 )。查看文件夹中的文件以获取一些示例。

--debug
refurb --debug file.py
refurb/checks/

然后,要加载新支票,请使用

refurb file.py --load your.path.here

请注意,使用 时,你需要在参数中使用点,就像导入普通的 python 模块一样。

--load

发展

要在本地设置,请运行:

$ git clone https://github.com/dosisod/refurb
$ cd refurb
$ make install
$ make install-local

可以使用 一次性运行所有测试,也可以使用 、 等单独运行每个工具。

make
make black
make flake8

可以使用 或 运行单元测试。

pytest
make test

由于端到端 (e2e) 测试速度很慢,因此在运行时不会运行它们。你需要运行它们才能运行它们。

make
make test-e2e

为什么会这样?

我喜欢做代码审查:我喜欢做一些东西,让它变得更好,更快,更优雅,等等。许多静态分析工具已经存在,但它们似乎都没有一个专注于使代码更优雅,更具可读性或更现代。这就是翻新的用武之地。

翻新的灵感来自 clippy,这是 Rust 的内置棉绒。

翻新不是什么

翻新不是样式/类型检查器。它不是作为检查和查找错误的第一道防线,而是为了让好的代码变得更好。