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

相关文章
|
2天前
|
安全 Java 数据安全/隐私保护
代码混淆技术探究与工具选择
代码混淆技术探究与工具选择
37 0
|
Java C# C++
Java源码转C#源码的五款最佳工具
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/41913581 Java源码转C#源码的五款最佳工具 作者:chszs,转载需注明。
1151 0
|
2天前
|
移动开发 安全 前端开发
uniapp打包iOS应用并通过审核:代码混淆的终极解决方案 ✨
本篇博客将教你如何使用 JavaScript-obfuscator 插件来一键发行和混淆 iOS 上的 uniapp 代码。通过安装插件、创建运行脚本,并执行混淆操作,你将能够轻松通过审核,提高应用程序的安全性。🔒
|
10月前
|
数据采集 存储 数据挖掘
如何编写一个完整的量化交易程序源码
如何编写一个完整的量化交易程序源码
|
12月前
|
缓存 Rust JavaScript
性能最快的代码分析工具,Ruff 正在席卷 Python 圈!
性能最快的代码分析工具,Ruff 正在席卷 Python 圈!
174 0
比心源码如何开发,这个功能要会实现
说到比心源码,不如讲讲比心源码实现聊天室功能该怎么做?
比心源码如何开发,这个功能要会实现
|
测试技术 图形学 C语言
《测试驱动的嵌入式C语言开发》——2.2节Unity:一个全部用C实现的自动化测试框架
本节书摘来自华章社区《测试驱动的嵌入式C语言开发》一书中的第2章,第2.2节Unity:一个全部用C实现的自动化测试框架,作者:(美)James W. Grenning,更多章节内容可以访问云栖社区“华章社区”公众号查看
3336 0
《编译与反编译技术实战 》一1.9 动态分析工具TEMU
TEMU是动态分析工具BitBlaze的一个组件,是一个基于系统仿真器QEMU开发的动态二进制分析工具,以QEMU为基础运行一个完整的系统(包括操作系统和应用程序),并对二进制代码的执行进行跟踪和分析。
1956 0