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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/18588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang 中实现实时聊天通讯

客户端代码 package mainimport ("fmt""log""net/url""os""os/signal""time""github.com/gorilla/websocket" )func main() {interrupt : make(chan os.Signal, 1)signal.Notify(interrupt, os.Interr…

webpack5 学习之路

1.视频 01-课程介绍_哔哩哔哩_bilibili 2.配套资料 依赖环境 | 尚硅谷 Web 前端之 Webpack5 教程 3.webpack 官方文档 入口起点(entry points) | webpack 中文文档 4.vue cli 官方文档 介绍 | Vue CLI 挖矿:Coding Tree

lombok

lombok lombok是一个简化java代码编写的工具类,可以简化javabean的编写,可以通过注解的方式消除代码中的构造方法,getter/setter等代码,简化类的编写。 Lombok原理分析 Lombok核心在于对注解的解析上。JDK5引入了注解的同时&…

ES派生类的prototype方法中,不能访问super的解决方案

1 下面的B.prototype.compile方法中,无法访问super class A {compile() {console.log(A)} }class B extends A {compile() {super.compile()console.log(B)} }B.prototype.compile function() {super.compile() // 报错,不可以在此处使用superconsole.…

Spring?Boot项目如何优雅实现Excel导入与导出功能

目录 背景EasyExcel 问题分析与解决Spring Boot Excel 导入与导出 依赖引入Excel 导入 基本导入功能进阶导入功能Excel 导出 Excel 导入参数校验 开启校验 校验规则定义 Bean Validation 定义校验规则ExcelValidator 接口定义校验规则校验结果接收 异常捕获接收校验结果contro…

小研究 - 主动式微服务细粒度弹性缩放算法研究(三)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放,忽略了能够充分利用单台服务器资源的细粒度垂直缩放,从而导致资源浪费。为此,本文设计了主动式微服务细粒度弹性缩放算法…

SDWAN组网案例——跨国游戏公司

XYZ Game Studios是一家国际知名的游戏开发公司,其游戏产品广受欢迎,拥有全球范围的玩家基础。由于游戏的在线特性和全球用户分布,XYZ Game Studios面临着跨国游戏服务器之间的网络连接和稳定性问题。他们希望提供更稳定、高效的游戏体验&…

使用 Go 语言实现二叉搜索树

原文链接: 使用 Go 语言实现二叉搜索树 二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影。 它有很多变种,比如红黑树,常被用作 std::map 和 std::set 的底层实现;B 树和 B 树,…

Total Variation loss

Total Variation loss 适合任务 图像复原、去噪等 处理的问题 图像上的一点点噪声可能就会对复原的结果产生非常大的影响,很多复原算法都会放大噪声。因此需要在最优化问题的模型中添加一些正则项来保持图像的光滑性,图片中相邻像素值的差异可以通过…

使用 Webpack 优化前端开发流程

在现代前端开发中,构建工具的选择和优化流程的设计至关重要。Webpack 是一个功能强大的前端构建工具,能够优化我们的开发流程,提高开发效率和项目性能。本文将介绍如何使用 Webpack 来优化前端开发流程。 代码优化和资源管理也是前端项目中不…

传统计算机视觉

传统计算机视觉 计算机视觉难点图像分割基于主动轮廓的图像分割基于水平集的图像分割交互式图像分割基于模型的运动分割 目标跟踪基于光流的点目标跟踪基于均值漂移的块目标跟踪基于粒子滤波的目标跟踪基于核相关滤波的目标跟踪 目标检测一般目标检测识别之特征一般目标检测识别…

18.Netty源码之ByteBuf 详解

highlight: arduino-light ByteBuf 是 Netty 的数据容器,所有网络通信中字节流的传输都是通过 ByteBuf 完成的。 然而 JDK NIO 包中已经提供了类似的 ByteBuffer 类,为什么 Netty 还要去重复造轮子呢?本节课我会详细地讲解 ByteBuf。 JDK NIO…

Spring学习记录----十五、面向切面编程AOP+十六、Spring对事务的支持

目录 十五、面向切面编程AOP 15.1 AOP介绍 总结 15.2 AOP的七大术语 15.3 切点表达式 15.4 使用Spring的AOP 15.4.1 准备工作 15.4.1.1Spring AOP 基于注解之实现步骤 15.4.1.2-Spring AOP 基于注解之切点表达式 代码 运行结果: 代码 运行结果 通知类…

Python高阶技巧 递归

递归的定义 函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。 递归的思想 把规模大的问题转化为规模小的、具有与原来问题相同解法的问题来解决。在函数实现时&#…

SpringBoot集成Thymeleaf

Spring Boot 集成 Thymeleaf 模板引擎 1、Thymeleaf 介绍 Thymeleaf 是适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 Thymeleaf 的主要目标是为开发工作流程带来优雅的自然模板,既可以在浏览器中正确显示的 HTML,也可以用作静态原型&#xf…

C#+WPF上位机开发(模块化+反应式)

在上位机开发领域中,C#与C两种语言是应用最多的两种开发语言,在C语言中,与之搭配的前端框架通常以QT最为常用,而C#语言中,与之搭配的前端框架是Winform和WPF两种框架。今天我们主要讨论一下C#和WPF这一对组合在上位机开…

后台生成验证码的方法,验证码相关

1、后台生成验证码的方法 /**** [验证码生成] [验证码生成]base64*/RequestMapping(value "/getverifycode", method RequestMethod.POST)public String getVerifyCode(RequestBody String param) {try {Integer codeLength Integer.parseInt("4");Int…

css图标 | 来自 fontawesome 字体文件的586 个小图标

1. css效果 /*!* Font Awesome 4.4.0 by davegandy - http://fontawesome.io - fontawesome* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)*/.fa-glass:before {content:"\f000"} .fa-music:before {content:"\f001"…

Nginx配置https链接跳转http

由于项目中实际用的http进行发布访问,网址链接没有指定为http类型,导致某些场景下打开链接是https方式进行访问,就会显示404错误,没法正常访问。 为了解决这种情况,需要进行Nginx配置,浏览器以https进行访…

小白如何理解MySQL?一文吃透

从本质上来说,MySQL也是一个软件,以Java为例,Java通过JDBC进行MySQL驱动连接后,通过调用“MySQL”的“接口”将SQL语句传给MySQL,并获取返回结果! 连接器 第一步,你会先连接到这个数据库上&…