当前位置: 首页 > news >正文

Python代码规范:企业级代码静态扫描-代码规范、逻辑、语法、安全检查,以及代码规范自动编排(2)

本篇将总结实际项目开发中Python代码规范检查、自动编排的一些工具,特点,使用方法,以及如何在Pycharm中集成这些工具,如autoflake、yapf、black、isort、autopep8代码规范和自动编排工具。上一篇总结的pylint、pyproject-flake8、pyflakes、flake8、mypy代码规范扫描工具参考:

https://blog.csdn.net/zhouruifu2015/article/details/129876922icon-default.png?t=N2N8https://blog.csdn.net/zhouruifu2015/article/details/129876922

autoflake

介绍

autoflake 可以从 Python 代码中删除未使用的导入和变量,以及无用的pass语句,以此精简你的代码。默认情况下,autoflake仅删除标准库中未使用的模块的导入,其他模块可能有副作用,所以禁止了自动删除,可以使用--imports 选项指定其他模块要删除未使用的导入:

autoflake --imports=django,requests,urllib3 <文件名>

要删除所有未使用的导入(无论它们是否来自标准库),可以使用 --remove-all-unused-imports 选项。

默认情况下,autoflake 禁用了删除未使用的变量,要删除未使用的变量,可以使用 --remove-unused-variables 选项。

安装&配置

安装:pip install --upgrade autoflake

使用

可选参数列表:

  1. -h, --help 显示帮助信息并退出
  2. -c, --check 如果需要更改则返回错误代码
  3. -i, --in-place 直接移除更改文件而不是打印差异
  4. -r, --recursive 递归目录
  5. --exclude 排除匹配文件/目录
  6. --imports 指定要删除未引用导入的模块
  7. --expand-star-imports 使用未定义名称扩展星号通配符导入,仅在只有一颗星导入时触发文件,如果文件中有 `__all__` 或 `del` 则跳过
  8. --remove-all-unused-imports 删除所有未使用的导入(不仅仅是那些来自标准库)
  9. --ignore-init-module-imports 排除 __init__.py
  10. --remove-duplicate-keys 删除对象中的所有重复键
  11. --remove-unused-variables 删除未使用的变量
  12. --version 显示程序的版本号并退出

如果想忽略某些行的导入移除,可以使用 # noqa 注释

from .endpoints import role , token, user, utils   # noqa

命令行中使用

直接整改文件:autoflake --in-place --remove-unused-variables example.py

输出检查结果不整改文件:autoflake autopep8_test.py

yapf

介绍

Yapf 是另一种有自己的配置项列表的重新格式化代码的工具。它与 Autopep8 的不同之处在于它不仅会指出代码中违反 PEP 8 规范的地方,还会对没有违反 PEP 8 但代码风格不一致的地方重新格式化,旨在令代码的可读性更强。

由Google开发维护的格式化工具,目的是让代码更漂亮;它支持很多的自定义选项,适合对自己的代码有特殊格式需求的场景;

yapf并不支持对import进行排序,所以需要使用isort工具。

安装&配置

执行 pip install yapf 安装 Yapf

  1. 可以yapf的格式化配置文件

[yapf]

based_on_style = pep8

spaces_before_comment = 4

split_before_logical_operator = true

based_on_style可以是前面的四种预设格式之一。

yapf有默认的查找格式化配置文件的策略,可以使用参数--no-local-style禁用搜索;查找策略的细节可以查看官方README。

  1. 可以是JSON格式的配置字符串

--style='{based_on_style: pep8, indent_width: 4}'

更多的配置选项可以使用命令yapf --style-help查看,或者查看官方文档:https://github.com/google/yapf#id11。

格式选项并不区分大小写。

使用

执行 yapf [options] path/to/dir  yapf [options] path/to/module.py 可以对代码重新格式化。

yapf命令行参数及格式化选项,yapf命令行工具的参数并不是很多,主要常用的有下面几个:

  1. -d, --diff:打印格式化前后差异
  2. -i, --in-place:原地格式化原文件
  3. -l START-END, --lines START-END:格式化指定行范围
  4. --style STYLE:指定格式化标准

其中--style最为常用,用于指定格式化的标准和自定义选项。可以是一些预设的选项,包括:

  1. pep8(默认值)
  2. google(基于Google Python Style Guide)
  3. yapf(用于Google开源项目的代码风格)
  4. facebook

格式化代码

yapf支持递归处理目录,使用-r参数可以遍历目录及其子目录,使用-e PATTERN或者--exclude PATTERN排除特定文件,比如:

yapf --style=pep8 -r -i --exclude "*_test.py" src/py

格式化代码之后,再使用isort进行imports的排序(当然,也可以先排序imports):

isort --fss --skip-glob "*_test.py" src/py

检查代码是否符合规范

检查代码是否符合规范,可以将yapf的-i参数替换为-d,如果存在不符合规范的内容,则打印出来,并且返回非0,比如:

yapf --style=pep8 -r -d --exclude "*_test.py" src/py

要检查imports是否符合规范,给isort添加-c, --check-only, --check参数即可,不符合规范将会报错,并返回非零值:

isort -c --fss --skip-glob "*_test.py" src/py

如此便可以在自动化检查的时候通过判断返回值是否为0,确定代码是否符合规范,从而可以在自动化构建的pipeline中提前结束,提示开发者重新格式化代码。

参考文档

https://github.com/google/yapf

https://github.com/google/yapf#usage

black

Black 在代码检查工具当中算是比较新的一个。它与 Autopep8 和 Yapf 类似,但限制较多,没有太多的自定义选项。这样的好处是不需要去决定使用怎么样的代码风格,让Black来做决定就好。可以在这里查阅 Black 有限的自定义选项以及如何在配置文件中对其进行设置

Black依赖于Python 3.6+,但它可以格式化用Python 2编写的代码。

Black配置选项很少,避免因为配置选项太多反而导致格式规范不一致。

介绍

安装&配置

执行 pip install black 安装 Black

使用

执行 black path/to/dir  black path/to/module.py 就可以使用 Black 优化代码。

参考文档

  1. https://en.wikipedia.org/wiki/Lint_(software)
  2. GitHub - psf/black: The uncompromising Python code formatter

isort

介绍

Isort 这个库能将项目中导入的库按字母顺序排序,并将其正确划分为不同部分(例如标准库、第三方库、自建的库等)。这样提高了代码的可读性,并且可以在导入的库较多的时候轻松找到各个库。

文档中还提供了更多的配置项,例如通过配置 .isort.cfg 文件来决定 isort 如何处理一个库的多行导入。

Flake8Pylint 一样,isort 也提供了将其与流行的编辑器和 IDE 集成的插件。

安装&配置

安装:pip install isort

Pycharm中配置isort

使用

执行 isort path/to/module.py 就可以运行了。

isort命令行参数和格式化选项

isort常用的命令行参数有:

-d, --stdout:输出到标准输出,不修改文件

-c, --check-only, --check:仅检查imports是否符合规范

--df, --diff:打印执行格式化前后的差异,而不修改文件

--profile PROFILE:基础配置选项,可选择black, django, pycharm, google, open_stack等常用风格。

--fss, --force-sort-within-sections:严格按照包名进行排序,而不管是直接使用import还是使用from ... import ...。

命令行中对单个文件转换

编写测试代码

执行后的效果,可以看出isort并没有把引入但未使用的os做移除

Pycharm中执行转换

对单个文件进行转换

对整个项目进行转换

参考文档

  1. Options:https://pycqa.github.io/isort/docs/configuration/options.html
  2. Profiles:https://pycqa.github.io/isort/docs/configuration/profiles.html
  3. https://github.com/PyCQA/isort
  4. https://github.com/PyCQA/isort/wiki/isort-Plugins

autopep8

介绍

A tool that automatically formats Python code to conform to the PEP8 style guide.

Autopep8 是一个开源的命令行工具,它能够将Python代码自动格式化为PEP8风格(如重新缩进行、修复缩进、删除多余的空格),并重构常见的比较错误(例如布尔值和 None 值),可以查看文档中完整的更正列表

Autopep8使用pycodestyle工具来决定代码中的哪部分需要被格式化,这能够修复大部分pycodestyle工具中报告的排版问题。

安装&配置

安装pip install autopep8

  1. Pycharm配置外置工具

Program:                  D:\env36_tornado\Scripts\autopep8.exe

Arguments:               --in-place --aggressive --aggressive $FilePath$

Working directory:     $ProjectFileDir$

Output filters:            $FILE_PATH$\:$LINE$\:$COLUMN$\:.*

  1. 如果Arguments仅仅配置成 $FilePath$ 则发现有不符合规范的文件,仅仅输出结果
  2. Arguments配置成 --in-place --aggressive --aggressive $FilePath$ 发现有不符合规范的文件,则会自动进行整改。

使用

--in-place类似于sed命令的-i选项,如果不包含–in-place选项,则会将autopep8格式化以后的代码直接输出到控制台。可以使用这种方式检查autopep8的修改,使用–in-place则会直接将结果保存到源文件中,将不会有任何输出,autopep8会直接修改源文件。

autopep8还存在--aggressive选项,这会执行更多实质性地更改,可以多次使用--aggressive,以达到更佳的效果。

  1. 命令行中针对单个指定文件

autopep8.exe --in-place --aggressive --aggressive <filename>

autopep8 --in-place --aggressive --aggressive autopep8.py

autopep8 --in-place --aggressive --aggressive 就可以重新格式化你的代码。aggressive 选项的数量表示 Auotopep8 在代码风格控制上有多少控制权。在这里可以详细了解 aggressive 选项。

  1. Pycharm中执行格式化

Pycharm编辑区域右击中选择autopep8

格式化后的效果,库的排列顺序还是没有做排序,以及引用但未使用的os库也没有去掉,可以考虑使用isort再次进行整改。

autopep8对目录进行扫描报:[Errno 13] Permission denied

Autopep8可以通过指定目录来对多个文件进行扫描和格式化。可以使用以下命令格式:

```bash

autopep8 --recursive <directory_path_or_file_path>

```

其中,`--recursive`选项指定进行递归操作,扫描目录下的所有子目录和文件。 `directory_path_or_file_path`指定目录路径或单个文件路径。

上述命令,进入项目目录执行:autopep8 --recursive  --in-place --aggressive --aggressive .

如果Linux上还遇到[Errno 13] Permission denied错误,则可能是因为没有足够的权限访问某些文件或目录。可以尝试在命令前加上`sudo`作为管理员身份运行命令,或者将文件或目录权限更改为可读写权限。

如果是Windows,则设置如下:

参考文档

GitHub - hhatto/autopep8: A tool that automatically formats Python code to conform to the PEP 8 style guide.A tool that automatically formats Python code to conform to the PEP 8 style guide. - GitHub - hhatto/autopep8: A tool that automatically formats Python code to conform to the PEP 8 style guide.https://github.com/hhatto/autopep8

 输入才有输出,吸收才能吐纳。——码字不易

相关文章:

Python代码规范:企业级代码静态扫描-代码规范、逻辑、语法、安全检查,以及代码规范自动编排(2)

本篇将总结实际项目开发中Python代码规范检查、自动编排的一些工具&#xff0c;特点&#xff0c;使用方法&#xff0c;以及如何在Pycharm中集成这些工具&#xff0c;如autoflake、yapf、black、isort、autopep8代码规范和自动编排工具。上一篇总结的pylint、pyproject-flake8、…...

acme.sh从 letsencrypt 生成SSL免费证书并自动更新证书

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书 ACME 协议: Automatic Certificate Management Environment 自动化证书管理环境 文档: github: https://github.com/acmesh-official/acme.shgitee: https://gitee.com/neilpang/acme.sh中文文档: https://git…...

基于html+css的evenly布局

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…...

【从零开始学习 UVM】10.5、UVM TLM —— UVM TLM Blocking Get Port

文章目录 UVM TLM Get Port Example1. 创建一个发送方类,其端口类型为 uvm_blocking_get_imp3. 创建接收器类,等待 get 方法。4. 在更高层次上连接端口及其实现Get端口阻塞行为任何组件都可以通过 TLM get 端口请求从另一个组件接收事务。发送组件应定义获取端口的实现。该实…...

English Learning - L2 第 10 次小组纠音 辅音 [m] [n] [ŋ] 半元音 [w] [j] 2023.3.29 周三

English Learning - L2 第 10 次小组纠音 辅音 [m] [n] [ŋ] [w] [j] 2023.3.29 周三共性问题more Autumn [ɔː] 舌位偏前gone evening 前后鼻音不分Hes proud of this name 双元音缺乏滑动感bank thing 中的后鼻音发成前鼻音week what yolk 元音 [iː] [ɒ] 舌位偏前 [əʊ] …...

从零开始实现一个C++高性能服务器框架----环境变量模块

此项目是根据sylar框架实现&#xff0c;是从零开始重写sylar&#xff0c;也是对sylar丰富与完善 项目地址&#xff1a;https://gitee.com/lzhiqiang1999/server-framework 简介 项目介绍&#xff1a;实现了一个基于协程的服务器框架&#xff0c;支持多线程、多协程协同调度&am…...

git常用命令的解释

解释git add . git add . 命令用于将当前目录下的所有文件添加到 Git 仓库的暂存区中。这个命令通常用于刚刚打开一个 Git 仓库时&#xff0c;或者用于将本地文件更新到远程仓库时。 具体来说&#xff0c;git add . 命令会将当前目录下的所有文件添加到 Git 仓库的暂存区中&am…...

DNS和CDN的区别与联系

现在互联网用户很多不能理解CDN和DNS之间的关系&#xff0c;他们之间到底有什么区别。对于这两者永远处于模糊的概念。其实二者是相辅相成的&#xff0c;二者搭配起来能使网站更加安全&#xff0c;快速。 用户访问未使用CDN缓存网站的过程为: 1、用户向浏览器提供要访问的域名…...

Java基础知识 | 常见面试题(中):面向对象基础

撰写成一问一答的形式&#xff0c;每次回答都默写&#xff0c;对比参考答案后&#xff0c;再默写出更恰当的答案。 相关内容 Java基础知识 | 常见面试题&#xff08;上&#xff09;&#xff1a;基础概念和常识 Java基础知识 | 常见面试题&#xff08;上&#xff09;&#xff1a…...

勒索软件正在从 Windows 转向 Linux

听说勒索软件正在从 Windows 转向 Linux了勒索软件正在从 Windows 转向 Linux 最近几周&#xff0c;黑客们一直在对 Linux 企业网络部署 IceFire 勒索软件&#xff0c;这是一个值得注意的转变&#xff0c;因为它曾经是一个只针对 Windows 的恶意软件。与 Windows 相比&#xf…...

信息系统项目管理师 第11章 项目成本管理

1.管理基础 1.重要性和意义 项目管理主要受范围、时间、成本、质量的约束,项目成本管理就是要确保在批准的预算内完成项目。 如果项目建设的实际成本远远超出批准的投资预算,就很容易造成成本失控。 1.对工程项目认识不足。 2.组织制度不健全。 3.方法问题 4.技术的制约 5.需…...

XML 简介

文章目录一、XML 简介二、XML 用途总结一、XML 简介 XML 被设计用来传输和存储数据。 HTML 被设计用来显示数据。 XML 指可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;。 可扩展标记语言&#xff08;英语&#xff1a;Extensible Markup Language&#xf…...

ERP:华为杀入,金蝶们打颤?

配图来自Canva可画 近期&#xff0c;华为官方透露将在4月份推出自研MetaERP管理系统&#xff0c;引来不少媒体和业内人士的围观&#xff0c;紧接着关于华为“进军ERP市场”的解读更是不胫而走&#xff0c;所谓一石激起千层浪&#xff0c;此说法一出&#xff0c;直接导致了金蝶…...

Linux——总复习1

1.要注意自己处于当前那个目录位置。 2.将file1的前五行/后三行重定向、附加到file2【输出重定向】 head -5 file1 > file2 tail -3 file1 >> file2 3.ls与cat区别 ls:列出目录的目录内容&#xff0c;未指定目录&#xff0c;则列出当前工作目录的内容 -l:查…...

控制SQL*PLUS的环境和数据字典简介

可以通过使用SET命令来设置SQL*PLUS的环境变量&#xff0c;从而达到控制SQL*PLUS 环境的目的。 SET命令的格式如下&#xff1a; SET 环境变量 变量的值 可以通过使用SHOW命令来显示SQL*PLUS环境变量的配置。SHOW 命令的格式如下&#xff1a; SHOW 环境变量|ALL 下面用一个…...

Chapter11.3:MATLAB_SIMULINK在离散系统中的应用

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…...

过滤器Filter

什么是Filter&#xff1f; Filter表示过滤器&#xff0c;是JavaWeb三大组件&#xff08;Servlet、FIlter、Listener&#xff09;之一。过滤器可以把对资源的请求拦截下来&#xff0c;总而实现一些特殊的功能 使用过滤器后&#xff0c;要想访问web服务器上的资源&#xff0c;必须…...

MySQL数据同步ES的常用思路和方法

文章目录 1.同步双写2.异步双写3.定时任务4.数据订阅大家应该都在各种电商网站检索过商品,检索商品一般都是通过什么实现呢?搜索引擎Elasticsearch。 那么问题来了,商品上架,数据一般写入到MySQL的数据库中,那么用于检索的数据又是怎么同步到Elasticsearch的呢? 1.同步双…...

spring源码之扫描前设置

扫描前设置 &#x1f6f9;源码源码说明总结启动一个springboot项目源码 org.springframework.context.annotation.ComponentScanAnnotationParser#parse public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, String declaringClass) {// 创建C…...

C++ 98/03 应该学习哪些知识19

迭代器、空间配置器理解 在 C 中&#xff0c;迭代器是一种可以用来遍历容器中的元素的对象。它们提供了一个类似于指针的接口&#xff0c;允许我们访问容器中的元素&#xff0c;而不必了解容器内部的结构。迭代器是 STL&#xff08;标准模板库&#xff09;的核心部分&#xff0…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...