Ruff代码分析

简介: Ruff代码分析

Ruff是一个用 Rust 语言编写的高性能的 Python 静态代码分析工具,比其它分析工具快几个数量级(10-100 倍),而且功能也很全面。


即 Linter,用于检查代码中的语法错误、编码规范问题、潜在的逻辑问题和代码质量问题等,可以提供实时反馈和自动修复建议。


在 Ruff 出现之前,社区里的代码分析工具呈现出百花齐放之势,比如有 Pylint、Flake8、Autoflake、Pyflakes、Pycodestyle 等等,它们的共同点是都使用 Python 编写而成。


Ruff 异军突起,在性能方面立于不败之地,主要得益于 Rust 天然的速度优势。Ruff 的出现,就像基于大语言模型的 ChatGPT 横空出世,所有竞争对手瞬间就黯淡失色了。



这里还必须介绍两个 Rust 项目,因为 Ruff 的成功离不开它们:


 

RustPython :用 Rust 写成的 Python 解释器。Ruff 利用了它高性能的 AST 解析器,以此实现了自己的 AST 遍历、访问器抽象和代码质量检测逻辑

 

Maturin :用 Rust 写成的打包工具,可以将 Rust 项目打包成 Python 可用的包,从而可以被我们“pip install”后使用,且不需要配置 Rust 环境


Ruff 的优点与局限性


介绍完最关键的特性后(速度极快、支持 pip),我们接下来看看 Ruff 的其它方面。


总体而言,它具有这些特点:


 

支持 pyproject.toml

 

兼容 Python 3.11

 

超过 500 条内置规则,与 Flake8 内置的规则集近乎对等

 

重新实现了数十个 Flake8 插件,如 flake8-bugbear、flake8-comprehensions 等

 

支持自动修复,可自动纠正错误(例如,删除未使用的导入)

 

内置缓存,可避免重复分析未更改的文件

 

支持 VS Code、Pycharm、Neovim、Sublime Text、Emacs 等编辑器

 

对 monorepo 友好,具有分层和级联配置


首先最值得介绍的是它支持的规则。Ruff 借鉴了流行的工具如 Flake8、autoflake、isort、pyupgrade、yesqa 等等,然后用 Rust 重新实现了超过 500 条规则。它本身不支持插件,但是吸收了数十个常用的 Flake8 插件的设计,使得已囊括的规则范围比其它任何工具都大。


Ruff 的作者还非常熟悉其它语言的分析工具,比如 Rust 的 Clippy 和 JavaScript 的 ESLint,并从这些项目上得到了设计上的启发。


Ruff 站在了多个工具/插件的肩膀上,重新实现了它们验证过的规则,也借鉴了它们的 API 和实现细节,这使得它扮演了一种“集大成”的角色,很方便使用者们作工具的顺滑迁移。


Ruff 第二个值得介绍的特点是,它没有局限于 Linter 的定位,而是借鉴 Rome、Prettier 和 Black 这些代码格式化工具(Formatter),也实现了代码格式化的功能。借鉴了 Autoflake、ESLint、Fixit 等工具,实现了代码自动纠错的功能。另外,它还借鉴了使用很广泛的 isort,支持对 import 作快速排序。


这些表明作者的目标并不只是开发一款优秀的代码分析工具,而是在静态代码分析的核心功能外,要创造出更多的可能性。此举是开发者的福音啊,以后一个工具就能满足多种诉求,再也不必纠结于不同工具的选型、协作与维护了!


Ruff 还有其它的优点,例如支持 pyproject.toml 、支持 Python 3.11、支持只分析变更的文件,等等。另外,它也有着一些局限性:


 

支持的 lint 规则还有不够

 

不支持使用插件,扩展性不强

 

用 Rust 开发的,因此不便于在出错时 debug,也不便于 Python 开发者给它贡献代码


关于第一点,毕竟 Ruff 只是 8 个月大的新生项目,支持更多的规则,只是时间问题。至于插件带来的扩展性和编程语言的开发者生态,原因也是 Rust,属于“有得必有失”了。


Ruff 的使用


介绍完 Ruff 的整体情况后,我们接着看看该如何使用它吧。


首先是安装,可以用 Conda 和其它包管理工具,也可以直接用 pip:

pip install ruff


可以通过以下命令运行:


ruff check .                        # 分析当前及子目录内的所有文件

ruff check path/to/code/            # 分析指定目录及子目录内的所有文件

ruff check path/to/code/*.py        # 分析指定目录内的所有py文件

ruff check path/to/code/to/file.py  # 分析 file.py



可以用作预提交的钩子:

- repo: https://github.com/charliermarsh/ruff-pre-commit

 # Ruff version.

 rev: 'v0.0.261'

 hooks:

   - id: ruff


可以通过 pyproject.toml ,ruff.toml 或 .ruff.toml 文件进行配置,默认配置已能满足基本使用,详细配置可以参见文档的 Configuration 。


Ruff 提供了官方的 VS Code 插件,可以快速上手:


Ruff 官方没有提供 Pycharm 的插件,社区中有人发布了一个 Ruff 插件。


另外,它还提供了ruff-lsp ,可以被集成到任何支持 Language Server Protocol 的编辑器中,例如 Neovim、Sublime Text、Emacs 等等。

目录
打赏
0
0
0
0
3
分享
相关文章
|
11月前
|
第十五章 Golang单元测试
第十五章 Golang单元测试
60 2
C代码演示WebAssembly工作流程
【2月更文挑战第3天】 工作流程: * C 代码使用 Emssripten 工具编译为 wasm 后缀的二进制文件,同时可以生成访问wasm的js胶水代码和html代码 * wasm后缀的二进制格式文件的文本表示方式为后缀为wat格式的文本文件,方便在编辑器和浏览器开发者工具中查看 * 可以使用wabt工具将wat格式的文本文件直接打包成wasm的二进制文件 * 使用WebAssemblyJavascriptAPI发起对wasm的调用 * 编写胶水代码 * 使用fetch/xhr获取wasm * 借助胶水代码访问wasm中的函数
149 0
Cargo:Rust的神秘助手,它将如何改变包管理游戏规则?
【8月更文挑战第31天】Rust的包管理器Cargo简化了依赖管理和构建过程,与编译器无缝集成,提供从依赖下载到编译构建的全套解决方案。通过`cargo new`创建项目后,编辑`Cargo.toml`文件即可轻松管理依赖。Cargo还支持自动生成文档、运行测试及发布代码,并通过`crates.io`平台方便查找和分享Rust库,是Rust生态系统中的重要工具,有助于提升开发者生产力。
97 1
【Pyhton入门系列】第十三篇:Python自动化测试和单元测试
自动化测试是软件开发中不可或缺的一部分,它可以提高软件质量、减少人工测试工作量,并确保代码的稳定性。Python作为一种简洁而强大的编程语言,提供了丰富的测试框架和工具,使得自动化测试和单元测试变得更加容易。
148 2
揭秘Go语言编译黑盒:从源代码到神奇可执行文件的完整过程
揭秘Go语言编译黑盒:从源代码到神奇可执行文件的完整过程
93 0
【Rust 基础篇】Rust宏:代码生成的黑魔法
Rust是一门以安全性和性能著称的系统级编程语言,它提供了强大的宏系统,使得开发者可以在编译期间生成代码,实现元编程(Metaprogramming)。宏是Rust中的一种特殊函数,它可以接受代码片段作为输入,并根据需要生成代码片段作为输出。本篇博客将深入探讨Rust中的宏,包括宏的定义、宏的分类、宏的使用方法,以及一些实际场景中的应用案例,以便读者全面了解Rust宏的神奇之处。
205 0
Rust源码学习 - Lint 执行流程
- 时间:2022.9.19 - 撰稿:[张正](https://github.com/He1pa)@[KusionStack开发组](https://github.com/KusionStack/kusion) - 收录于:[rust-code-book](https://github.com/awesome-kusion/rust-code-book) - 源码学习系列 + [Lint 与
Rust源码学习 - Lint 执行流程
对Any_percision的代码分析
首先是数据集的选择:cifar10, imagenet,svnh 网络的选择:resent20q
89 0