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 等等。

相关文章
|
存储 程序员 编译器
Visual Studio 2022 程序员必须知道高效调试手段与技巧(下)终章
Visual Studio 2022 程序员必须知道高效调试手段与技巧(下)终章
157 0
|
1月前
|
Rust 安全 Linux
Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路
Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路
42 0
Rust-01 Hello Rust 10分钟上手编写第一个Rust程序 背景介绍 发展历史 环境配置 升级打怪的必经之路
|
6月前
|
算法 编译器 测试技术
跨平台构建的艺术:使用 CMake 实现项目移植的全面指南
跨平台构建的艺术:使用 CMake 实现项目移植的全面指南
406 5
|
6月前
|
JavaScript 前端开发 编译器
TypeScript的编译器、编辑器支持与工具链:构建高效开发环境的秘密武器
【4月更文挑战第23天】TypeScript的强大力量源于其编译器、编辑器支持和工具链,它们打造了高效的开发环境。编译器`tsc`进行类型检查、语法分析和代码转换;编辑器如VS Code提供智能提示、错误检查和格式化;工具链包括Webpack、Rollup等构建工具,Jest、Mocha等测试框架,以及代码质量和性能分析工具。这些组合使用能提升开发效率、保证代码质量和优化项目性能。
|
6月前
|
缓存 编译器 测试技术
简化 CMake 多平台兼容性处理:高效开发的秘诀
简化 CMake 多平台兼容性处理:高效开发的秘诀
232 0
|
6月前
|
移动开发 安全 前端开发
uniapp打包iOS应用并通过审核:代码混淆的终极解决方案 ✨
本篇博客将教你如何使用 JavaScript-obfuscator 插件来一键发行和混淆 iOS 上的 uniapp 代码。通过安装插件、创建运行脚本,并执行混淆操作,你将能够轻松通过审核,提高应用程序的安全性。🔒
|
消息中间件 存储 安全
这五款牛逼的 IDEA 插件,堪称代码质量检查利器!
这五款牛逼的 IDEA 插件,堪称代码质量检查利器!
|
缓存 Rust JavaScript
性能最快的代码分析工具,Ruff 正在席卷 Python 圈!
性能最快的代码分析工具,Ruff 正在席卷 Python 圈!
243 0
|
IDE Java 程序员
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
363 0
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
|
Web App开发 关系型数据库 Java