[Python工程化之路] 搭建Python开发环境 包管理环境以及Linter

个人博客:Sekyoro的博客小屋
个人网站:Proanimer的个人网站

在工程化上,Python相比于Java,C#这类语言还是差了不少,不过整个生态还是不错的.

项目结构

一般有两种,一种称为flat另一种为src.

  1. ├── sample
    │ ├── AUTHORS.rst
    │ ├── docs
    | | ├── conf.py
    │ │ └── index.rst
    │ ├── HISTORY.rst
    │ ├── LICENSE
    │ ├── makefile
    │ ├── MANIFEST.in
    │ ├── README.rst
    │ ├── requirements.txt
    │ ├── sample
    | | ├── app.py
    │ │ └── helper.py
    | ├── setup.cfg
    | ├── setup.py
    │ └── tests
    image-20231204170021714

  2. image-20231204171740258

主要是使用poetry等工具打包的时候需要注意一下,因为pyproject.toml字段不完全相同.

FAQ

  1. ImportError: attempted relative import with no known parent package

包中的模块使用相对导入时不能直接运行该模块,一般是其他包或顶级模块进行调用

工具链

版本管理工具

Anaconda可以同时解决Python版本和包管理的问题,但如果只是想开发个包,没有必要使用conda,在linux上可以考虑pyenv+poetry,windows上有对应的pyenv-windows+poetry.

pyenv允许您轻松地在多个版本的Python之间切换。它简单、不引人注目,并且遵循了UNIX传统的单用途工具,可以很好地完成一件事。

pyenv/pyenv: Simple Python version management (github.com)

包管理工具

目前开发Python包我推荐Poetry或者PDM,如果是搞数据计算直接Anaconda.

Poetry

Introduction | Documentation | Poetry - Python dependency management and packaging made easy (python-poetry.org)

某种程度上告别setup.py,除了一般的虚拟环境和包管理之外,打包和发布到PYPI等都支持,也是现在比较火的工具.

虚拟环境管理类似conda,会在某个目录下放所有的虚拟环境

image-20231204163324338

poetry init
poetry install 
poetry shell

通过初始化一个新的Poetry项目,这将以交互方式生成一个文件pyproject.toml。该文件将具有所有包依赖项。这与requirements.txt文件类似。

当参数 virtualenvs.createtrue 时,执行 poetry installpoetry add 时会检测当前项目是否有虚拟环境,没有就自动创建,默认为 true

当参数 virtualenvs.in-projecttrue 时,虚拟环境的依赖将会放置于项目的文件夹内,而不是 poetry 默认的 {cache-dir}/virtualenvs,默认为 false

我的配置如下:

image-20231204164441421

当Poetry完成安装后,它会将所有包及其下载的确切版本写入Poetry.lock文件,从而将项目锁定到这些特定版本。该锁定文件也应包含在您的项目repo中,以便在项目中工作的每个人都被锁定到相同版本的依赖项。

image-20231204163627134

PDM

pdm-project/pdm: A modern Python package and dependency manager supporting the latest PEP standards (github.com)

支持最新PEP标准的现代Python包和依赖项管理器. Poetry的pyproject.toml与PEP标准不完全符合.

PDM可以管理项目和集中位置的虚拟环境(venv),类似于Pipenv。它从标准化的pyproject.toml文件中读取项目元数据,并支持锁定文件。用户可以通过插件添加额外的功能,这些功能可以通过将其作为分发版上传来共享。与Poetry和Hatch不同,PDM不局限于特定的构建后端;用户可以自由选择他们喜欢的任何构建后端。

Formatter

代码格式化工具,一般用black就够了.

Black

Black是不折不扣的Python代码格式化程序。通过使用它,您同意放弃对手工格式化细节的控制。作为回报,Black为您提供了速度、决定论和自由,使您免受pycode风格对格式的唠叨。你会为更重要的事情节省时间和精力。无论您正在阅读的项目是什么,变黑的代码看起来都是一样的。一段时间后,格式将变得透明,您可以转而关注内容。Black通过产生尽可能小的差异来加快代码审查。

pip install black
black {source_file_or_directory}
yapf

YAPF是一个基于clang格式的Python格式化程序(由Daniel Jasper开发)。本质上,该算法采用代码并计算符合配置样式的最佳格式。它省去了维护代码的许多繁琐工作。最终目标是YAPF生成的代码与程序员在遵循样式指南的情况下编写的代码一样好。

pip install yapf
autopep8

autoep8自动格式化Python代码,以符合PEP8样式指南。它使用pycodestyle实用程序来确定需要格式化代码的哪些部分。autoep8能够修复pycodestyle可能报告的大多数格式问题。

pip install --upgrade autopep8
autopep8 --in-place --aggressive --aggressive <filename>

Linter

一般用pylint足矣,喜欢尝鲜的可以用用Ruff.

PyLint

Pylint是Python 2或3的静态代码分析器。最新版本支持Python 3.8.0及以上版本。Pylint在不实际运行代码的情况下分析代码。它检查错误,强制执行编码标准,寻找代码气味,并可以就如何重构代码提出建议。

pip install pylint
flake8

Flake8是这些工具的包装:PyFlakespycode样式Ned Batchelder的McCabe脚本Flake8通过启动单个Flake8命令来运行所有工具。它在每个文件的合并输出中显示警告。PyCQA/flake8: flake8 is a python tool that glues together pycodestyle, pyflakes, mccabe, and third-party plugins to check the style and quality of some python code. (github.com)

Ruff

比较新的工具astral-sh/ruff: An extremely fast Python linter and code formatter, written in Rust. (github.com),不只是语法提示器,也可以用于格式化.

pip install ruff

ruff path/to/code/to/check.py
ruff path/to/code/
ruff path/to/code/*.py

类型检查工具

在Python中使用typing的检查工具,此外与PydanticWelcome to Pydantic - Pydantic搭配使用效果更佳

Pydantic是Python中使用最广泛的数据验证库。Pydantic快速且可扩展,可以很好地处理您的linters/IDE/brain。

定义数据应该如何使用纯规范的Python 3.7+;用Pydantic验证它。

from datetime import datetime
from typing import Tuple

from pydantic import BaseModel


class Delivery(BaseModel):
    timestamp: datetime
    dimensions: Tuple[int, int]


m = Delivery(timestamp='2020-01-02T03:04:05Z', dimensions=['10', '20'])
print(repr(m.timestamp))
#> datetime.datetime(2020, 1, 2, 3, 4, 5, tzinfo=TzInfo(UTC))
print(m.dimensions)
#> (10, 20)

Mypy

python/mypy: Optional static typing for Python (github.com)

Mypy是Python的静态类型检查器。类型检查器有助于确保您在代码中正确使用变量和函数。

使用mypy,将类型提示(PEP484)添加到Python程序中,当您错误地使用这些类型时,mypy会发出警告。Python是一种动态语言,所以通常只有当你试图运行它时,你才会在代码中看到错误。Mypy是一个静态检查器,所以它甚至不用运行就可以发现程序中的错误!

python3 -m pip install -U mypy
mypy PROGRAM
Pyright

microsoft/pyright: Static Type Checker for Python (github.com)

Pyright是一个功能齐全、基于标准的Python静态类型检查器。它是为高性能而设计的,可以与大型Python源代码库一起使用。

Git pre-commit hook

git commit之前设置hook进行代码检查

Test

测试工具

Pytest

pytest框架使编写小型可读测试变得容易,并且可以扩展以支持应用程序和库的复杂功能测试。

pip install -U pytest

参考资料

  1. python项目结构示例(python代码结构、python目录结构)与python部署结构、python部署目录、flask项目结构、flask目录_python项目结构目录结构-CSDN博客
  2. 各类Python项目的项目结构及代码组织最佳实践_python项目结构___弯弓__的博客-CSDN博客
  3. Python最佳工程实践,建立一个完美的工程项目 - cuiyubo - 博客园 (cnblogs.com)
  4. 8 Pre-commit Git Hooks You Must Know for Improved Productivity - Hatica
  5. 结构化您的工程 — The Hitchhiker’s Guide to Python (pythonguidecn.readthedocs.io)

如有疑问,欢迎各位交流!

服务器配置
宝塔:宝塔服务器面板,一键全能部署及管理
云服务器:阿里云服务器
Vultr服务器
GPU服务器:Vast.ai

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入Apache Commons Config:管理和使用配置文件

第1章&#xff1a;引言 咱们都知道&#xff0c;在软件开发中&#xff0c;管理配置文件是一件既重要又让人头疼的事。想象一下&#xff0c;咱们的应用程序有一堆设置需要调整&#xff0c;比如数据库的连接信息、应用的端口号&#xff0c;或者是一些功能的开关。如果这些信息硬编…

java实现广度优先搜索算法

广度优先搜索算法&#xff08;BFS&#xff09;是一种用于图遍历的算法。它从图的某个节点开始&#xff0c;依次访问其所有邻接节点&#xff0c;再依次访问邻接节点的邻接节点&#xff0c;以此类推&#xff0c;直到遍历完所有节点。 BFS使用队列数据结构来实现遍历过程。具体步…

关于 Appium 各种版本的安装,都在这里

大家在初次接触 Appium 时会看到网上各种帖子讲解如何安装 Appium&#xff0c;各种 Appium 版本的安装教程满天飞&#xff0c;而很多帖子中提供的安装教程是已经过时了的&#xff0c;容易误导初学者。 这篇文章带着你一起全面了解 Appium 各种版本如何选择如何安装。 一句话概述…

Superset 二次开发之自定义Viz Plugins(Hello World v2)

环境&#xff1a; Node.js 16npm 7 or 8安装webpack 全局安装 npm install webpack -g 安装eslint superset-frontend> npm install eslint 1.Yeoman 生成器 全局安装Yo> npm i -g yo 2.进入/superset-frontend/packages/generator-superset目录 npm i && npm…

传感器原理与应用--传感器基本特性与应变式传感器

文章目录 上一篇传感器的基本特性应变式传感器应变式传感器的应用下一篇 上一篇 传感器的基本特性 一般来说能把特定被测量信息按一定规律转换成某种可用信号的器件或装置&#xff0c;称为传感器 静态特性 灵敏度 定义&#xff1a;输出量增量 Δ y \Delta y Δy与引起输出量…

xstream 远程代码执行 CVE-2021-29505 已亲自复现

xstream 远程代码执行 CVE-2021-29505 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 XStream 是用于将 Java 对象序列化为 XML 并再次序列化的软件。 1.4.17 之前的 XStream 版本中存在一个漏洞&#xff0c;可能允许远程攻…

集成钉钉机器人消息推送

一、简介 背景 客户需要通过钉钉接收消息通知 名词解释 群聊机器人&#xff1a;钉钉群里可以创建一个机器人&#xff0c;平台通过机器人把告警/通知推送到群里私聊机器人&#xff1a;钉钉后台开启机器人配置&#xff0c;平台绑定此机器人后&#xff0c;可以通过私聊的方式将…

C/S医院检验LIS系统源码

一、检验科LIS系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff…

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850 2023/12/26 8:22 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab And…

一文搞懂类加载过程

废话不多说&#xff0c;先上一张图 1、“加载”过程做了什么&#xff1f;什么是双亲委派&#xff1f;为什么要使用双亲委派机制&#xff1f;有什么利弊&#xff1f; **加载&#xff1a;**就是将编译后的.class字节码文件【jvm只认.class文件&#xff0c;.class文件也并非只有…

C++ std::string使用效率优化

字符串操作是任何一个C开发程序无法绕过的点&#xff0c;很多时候针对字符串的操作需要进行优化&#xff0c;从而达到更优的使用效率和内存利用率。一般会采用标准的std::string替代C字符串&#xff0c;一方面是std::string为一个成熟的类对象&#xff0c;其成员操作基本能满足…

阿赵UE学习笔记——4、新建关卡

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   之前介绍了虚幻引擎的常用窗口功能&#xff0c;这次开始创建游戏内的世界了。首先先从创建关卡开始。 一、创建新关卡 在使用UE引擎制作游戏&#xff0c;首先要有一个场景作为基础&#xff0c;这个场景在UE里面成为关卡。…

若依(Spring boot)框架中如何在不同的控制器之间共享与使用数据

在若依框架或Spring boot框架中&#xff0c;控制器共享和使用数据是为了确保数据一致性、传递信息、提高效率和降低系统复杂性。这可以通过全局变量、依赖注入或数据库/缓存等方式实现。共享和使用数据对框架的正常运行非常关键&#xff0c;有助于促进控制器之间的协同工作&…

消息走漏提前做空腾讯爆赚30倍?逐帧分析还原真相

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

C语言结构体内存对齐

文章目录 一、结构体内存对齐问题二、查看结构体成员起始位置三、设置内存对齐方式 一、结构体内存对齐问题 如下的info_s结构体类型&#xff0c;包含一个int型成员age, 一个char型成员gender, 一个int型成员id。 单从数据成员的大小进行分析&#xff0c;整个结构体的大小应为…

【JavaWeb学习笔记】18 - 文件上传下载

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/fileupdown 目录 文件上传 一、基本介绍 二、文件上传的基本原理 ​编辑 三、文件上传应用实例 四、文件上传的注意细节 1.解决中文乱码问题 2.分割文件夹 3.防止重名 4.百度WebUploader 5.空…

Windows无法安装edge 无法连接Internet

如果出现以上问题&#xff0c;或者Edge浏览器无法更新&#xff0c;提示防火墙错误之类的都可以解决问题。 下载以下证书文件并导入即可解决问题。 MicrosoftRootCertificateAuthority2011.cer

注意力机制(数学公式)

人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性 计算机注意力机制是为了让卷积神经网络注意到他更加需要注意的地方 &#xff0c;而不是什么都关注 。 分为三种注意力机制&#xff0c;空间注意力机制&#xff0c;通道注意力机制&#xff0c;以及两者的结合。 …

关于MULTI#STORM活动利用远程访问木马瞄准印度和美国的动态情报

一、基本内容 于2023年6月22日&#xff0c;一款代号为MULTI#STORM的新网络钓鱼活动将目标瞄准了印度和美国&#xff0c;利用JavaScript文件在受感染的系统上传播远程访问木马。 二、相关发声情况 Securonix的研究人员Den luzvyk、Tim Peck和Oleg Kolesnikov发表声明称&#x…

【AI服饰】孔雀背景服装_AIGC服饰订制设计咨询产业

服饰系列 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;服饰图是指通过人工智能生成的服装设计图案。随着人工智能技术的不断进步&#xff0c;AIGC服饰图在未来有着广阔的发展空间。 首先&#xff0c;AIGC服饰图可以提供更多的设计可能性。传统的服…