Python 项目工程化最佳实践指南

python深度学习】——大型工程项目管理以及互相导入 与相对导入不同,绝对导入不会依赖于当前模块的位置,而是基于项目的根目录来定位模块。并且你是在项目的根目录下运行了python test/test_gui.py这个命令,那么就可能会产生上述报错。这里依然更推荐以python -m的方式,在工程根目录来运行包中的模块.来开展单元测试, 我们有两种方式可以实现, 分别是。 阅读详情

Python 工程化这件事都没有统一的规范和项目管理的方案,也许是因为 Python 突然兴起的时间较短、用于开发大型项目的公司较少。所以为了帮助内部的同学更好的解决 Python 工程化问题和分享下个人的开发习惯和代码管理思路写下这篇文章。

依赖管理

在 PEP 518 和 pyproject.toml 引入之前。一个项目无法告诉一个像 pip 这样的工具它需要什么样的构建工具来构建。现在 setuptools 有一个 setup_require 参数来指定构建项目所需的东西,但是除非你安装了 setuptools,否则你无法读取该设置,这意味着你不能声明你需要 setuptools 来读取 setuptools 中的设置。这个鸡和蛋的问题就是为什么像 virtualenv 这样的工具会默认安装 setuptools,以及为什么 pip 在运行一个 setup.py 时总是会注入 setuptools 和wheel,不管你是否显式地安装了它。你甚至不要尝试依赖于 setuptools 的一个特定版本来构建你的项目,因为你没有办法来指定版本; 不管用户碰巧安装了什么,你都得将就使用。

在 PEP 518 之后你可以声明你的构建工具以及要求的版本。

在过去我们可能会经常使用 requirements.txt 之类的文件来保存我们项目所需的依赖,但是它并没有很好的办法去区分我们在生产环境、开发环境、测试环境所需要的依赖必须要分成多份文件单独声明,通过一些新的构建工具我们就可以解决我们的问题。而且单独用 requirements.txt 也不能声明我们需要的 python 版本、系统环境等等。

在这次的内部项目开发中,我选择的是 PDM,PDM 旨在成为下一代 Python 软件包管理工具。它最初是为个人兴趣而诞生的。如果你觉得 pipenv 或者 poetry 用着非常好,并不想引入一个新的包管理器,那么继续使用它们吧;但如果你发现有些东西这些工具不支持,那么你很可能可以在 pdm 中找到。

Poetry 看起来也是个不错的选择,Poetry 和 Pipenv 、PDM 类似,是一个 Python 虚拟环境和依赖管理工具,另外它还提供了包管理功能,比如打包和发布。你可以把它看做是 Pipenv 和 Flit 这些工具的超集。它可以让你用 Poetry 来同时管理 Python 库和 Python 程序。

如果你用的是 PDM 或者 Poetry 请先在项目目录中,通过 virtualenv 创建一个叫 .venv 或者类似的文件夹。为什么我推荐 virtualenv 而不是 PEP582 呢?在很多系统下都依赖了一个默认的 python 版本,如果用 PEP582 的话,默认会使用系统自带的 python 版本,如果不用的话我们又必须额外的要生成一个需要的 python 版本对应的虚拟环境;其次是目前 vscode 并不支持。

我们可以利用这些构建工具,将我们的开发环境、测试环境、生产环境的依赖都区分开来。

我们同样可以在 pyproject.toml 中增加构建工具的额外命令,比如可以增加用于启动服务的 start 命令、测试用的 test 命令等等。类似 PDM Scripts 所描述的一样。通过构建工具启动服务能很有效解决包所在位置的问题,强制让所有的包的运行目录都为项目根目录。

项目结构

推荐的项目结构如下:

Dockerfile

这个文件主要用于给 Docker 构建镜像使用,建议在生产环境部署时通过 Docker 进行部署。

docs

专门用于保存文档的文件夹。

LICENSE

如果这个是一个开源项目,那么这个文件一般用于放置使用的开源协议。

pyproject.toml

基于 PEP518 规范的配置文件,保存了项目介绍、作者联系方式、所依赖的包、使用的构建工具等等。

README.md

主要用于放项目介绍、使用说明的 MarkDown 文档。

{project_name}

放实际项目代码的文件夹,你可以取任意的名字,但需要确保不跟你所依赖的其它第三方的包名字重复。之所以不用 src 是因为你在编写测试用例、或者把它作为 python 的包给其它项目用时会更方便。

{project_name}-stubs

{project_name}-stubs中的 project_name需要跟上面那个文件夹的名字一致,然后拼接 -stubs,比如项目叫 andy,那么这个文件夹叫 andy-stubs。如果你的项目是一个 python 的库的话,你可以在这个文件夹中存放 mypy 生成的类型描述文件。mypy 会自动读取这个项目中的类型描述,方便做类型判断。详情见 mypy 文档

tests

用来存放单元测试等的文件夹。

tox.ini

tox 的配置文件。

.gitignore

用于告诉 git 应该忽略哪些文件。

模块引用

Python 模块是最主要的抽象层之一,并且很可能是最自然的一个。抽象层允许将代码分为 不同部分,每个部分包含相关的数据与功能。

例如在项目中,一层控制用户操作相关接口,另一层处理底层数据操作。最自然分开这两 层的方式是,在一份文件里重组所有功能接口,并将所有底层操作封装到另一个文件中。 这种情况下,接口文件需要导入封装底层操作的文件,可通过 importfrom ... import 语句完成。一旦你使用 import 语句,就可以使用这个模块。 既可以是内置的模块包括 os 和 sys,也可以是已经安装的第三方的模块,或者项目 内部的模块。

为遵守风格指南中的规定,模块名称要短、使用小写,并避免使用特殊符号,比如点(.) 和问号(?)。如 my.spam.py 这样的名字是必须不能用的!该方式命名将妨碍 Python 的模块查找功能。就 my.spam.py 来说,Python 认为需要在 my 文件夹 中找到 spam.py 文件,实际并不是这样。如果愿意你可以将模块命名为 my_spam.py, 不过并不推荐在模块名中使用下划线。但是,在模块名称中使用其他字符(空格或连字号) 将阻止导入(-是减法运算符),因此请尽量保持模块名称简单,以无需分开单词。 最重要的是,不要使用下划线命名空间,而是使用子模块。

# OK
import library.plugin.foo
# not OK
import library.foo_plugin

除了以上的命名限制外,Python文件成为模块没有其他特殊的要求,但为了合理地使用这 个观念并避免问题,你需要理解 import 的原理机制。具体来说,import modu 语句将 寻找合适的文件,即调用目录下的 modu.py 文件(如果该文件存在)。如果没有 找到这份文件,Python 解释器递归地在 “PYTHONPATH” 环境变量中查找该文件,如果仍没 有找到,将抛出 ImportError 异常。

一旦找到 modu.py,Python 解释器将在隔离的作用域内执行这个模块。所有顶层 语句都会被执行,包括其他的引用。方法与类的定义将会存储到模块的字典中。然后,这个 模块的变量、方法和类通过命名空间暴露给调用方,这是Python中特别有用和强大的核心概念。

在很多其他语言中,include file 指令被预处理器用来获取文件里的所有代码并‘复制’ 到调用方的代码中。Python 则不一样:include 代码被独立放在模块命名空间里,这意味着您 一般不需要担心 include 的代码可能造成不好的影响,例如重载同名方法。

也可以使用import语句的特殊形式 from modu import * 模拟更标准的行为。但 import * 通常 被认为是不好的做法。使用 from modu import * 的代码较难阅读而且依赖独立性不足。 使用 from modu import func 能精确定位您想导入的方法并将其放到全局命名空间中。 比 from modu import * 要好些,因为它明确地指明往全局命名空间中导入了什么方法,它和 import modu 相比唯一的优点是之后使用方法时可以少打点儿字。

import modu
[...]
x = modu.sqrt(4)

其次是如果引用自己项目的的模块时,加入你的项目叫 my,模块叫 modu,那么不建议使用 from my import modu来引用,强烈推荐使用 from . import modu

其次是建议如果需要给其它模块引用某些类的时候,请在这个模块的 __init__.py 中暴露并且加上 as 代替一些语言中的 export。

from .config import Config as Config

并且完全不建议在 __init__.py 放置大量代码,建议只用于代替 export。

__init__.py 中加了过多代码,随着项目的复杂度增长, 目录结构越来越深,子包和更深嵌套的子包可能会出现。在这种情况下,导入多层嵌套 的子包中的某个部件需要执行所有通过路径里碰到的 __init__.py 文件。如果 包内的模块和子包没有代码共享的需求,使用空白的 __init__.py 文件是正常甚至好的做法。

类型检查

Python是一门动态语言,很多时候我们可能不清楚函数参数类型或者返回值类型,很有可能导致一些类型没有指定方法,在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,typing 模块可以很好的解决这个问题。

自 python3.5 开始,PEP484 为 python 引入了类型注解 (type hints)。

Mypy 是 Python 中的静态类型检查器。Mypy 具有强大且易于使用的类型系统,具有很多优秀的特性,例如类型推断、泛型、可调用类型、元组类型、联合类型和结构子类型。推荐使用 mypy 作为类型检查工具并且每个方法必须声明清楚参数、参数的类型、返回值类型。

def register(
    self, factory: Optional[PooledObjectFactory] = None, name: Optional[str] = None
) -> None:

	pass

如果这个参数或者返回值可以为空,应当标注 Optional 或者使用 3.11 的语法 类型 | None。如 PooledObjectFactory | None。

在 vscode 中你可以安装 mypy 的插件,这样可以直接在 vscode 中完成类型检查。

代码格式化和风格检查

为了帮助开发者统一代码风格,Python 社区提出了 PEP8 代码编码风格,它并没有强制要求大家必须遵循,Python 官方同时推出了一个检查代码风格是否符合 PEP8 的工具,名字也叫 pep8。

Black 自称“零妥协代码格式化工具(The uncompromising code formatter)”。

Black 号称是不妥协的 Python 代码格式化工具。之所以成为“不妥协”是因为它检测到不符合规范的代码风格直接就帮你全部格式化好,根本不需要你确定,直接替你做好决定。而作为回报,Black 提供了快速的速度。 Black 通过产生最小的差异来更快地进行代码审查。 Black 的使用非常简单,安装成功后,和其他系统命令一样使用,只需在 black 命令后面指定需要格式化的文件或者目录即可。

某种意义上来说一个可配置很低的代码格式化和检查工具在团队中比一个可以大量自定义配置的更好。现代的 IDE 一般都提供了对 Black 的支持。

配置管理

建议将配置放在 {project_name}/{project_name} 文件夹中,使用 yaml 格式进行保存。之所以不用 toml 之类的格式是因为如果用 k8s 之类的配置映射功能的话就没法使用了,yaml 则可以很好的与其它系统保持兼容。

你可以将配置所在的 yaml 文件读取出来并且反序列化成一个配置对象。这个配置对象可以是 python 中的 dataclass 也可以就是一个普通的类,并且上面声明配置的每个字段。

配置是一种可能经常会增删字段的东西,我们不应该通过类似 dict 的方式进行操作。

异常管理

几乎所有编程语言中都有异常。异常可以快速指出程序出现的问题,便于排查。开发人员也可以根据情况抛出自定义异常, 以指示期望的内容和实际不相符。良好的异常设计和使用习惯,可以提高程序的质量。

在逻辑中,可能出现不符合预期的逻辑,会抛出相关异常。此时在编码时,为了逻辑的正常运行,需要对逻辑进行处理,捕获异常。

捕获异常是,使用 try...except 代码块包裹需要处理异常的代码。 expect 捕获指定的异常类型,如果出现,进入 对应的代码逻辑。对于一些不想处理的,通过 raise 抛出异常。

在捕获时尽量不要捕获宽泛的异常基类如 Exception,而是捕获具体的异常,如 ValueError。

处理异常时,如果没有继续抛出异常,需要输入日志信息。除非你知道不输出任何信息不会造成拍错困难。项目异常要以 ERROR 结尾。和标准异常命名类似。

测试

在 Python 中除了有语言内置的测试框架之外,还有许多第三方测试框架,一些非测试框架内部也会内置测试框架。其目的都是在内置测试框架的基础上 增加了一些特性,让编写测试更加方便,测试过程更加顺畅。

为了方便测试框架查找测试用例,在编写测试时应遵循一定的规范:

  • 测试模块要以 test_ 开头
  • 测试方法要以 test_ 开头
  • 测试类名要以 Test 开头

测试都放到 tests 文件夹下面。

Pytest 是在 unittest 的基础上 增加了大量语法糖,让测试更加简便和灵活。并且带有插件功能,方便集成其他功能。

由于 Pytest 能兼容其他大多数测试框架,而且它也具有强大的功能,所以推荐使用 Pytest 作为主要测试框架使用。

tox 是通用的虚拟环境管理和测试命令行工具。tox 能够让我们在同一个 Host 上自定义出多套相互独立且隔离的 python 环境,如果你的项目需要兼容多个 python 版本的话强烈推荐使用它。

---------------------------END---------------------------

题外话

当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

2024年Python零基础学习指南:从环境搭建到实战项目 Python作为一门简洁高效的编程语言,其核心价值在于将复杂问题抽象为可执行的代码逻辑。其设计哲学强调代码的可读性和简洁性,通过清晰的语法结构和丰富的标准库,降低了编程入门门槛。在技术层面,Python通过解释器执行,支持面向对象、函数式编程等多种范式,使其在数据处理、自动化脚本、Web开发等领域展现出强大的工程实践能力。特别是在数据分析与网络爬虫等应用场景中,Python凭借pandas、requests等库成为行业首选工具。本文聚焦于Python学习路径规划,针对零基础学习者常见的环境配置与核心语法掌握 阅读详情

相关推荐

Python爬虫工程化实战:企业级数据采集平台构建指南

工程化能力是区分业余爱好者和专业开发者的分水岭!学习DevOps:掌握CI/CD、容器编排深入数据分析:从采集到洞察的全流程研究系统设计:高可用、可扩展架构培养产品思维:以终为始规划爬虫项目立即获取完整资源包包含:- 标准项目模板- Docker生产配置- 自动化测试套件- 监控告警规则- 团队协作规范声明:所有技术方案需遵守当地法律法规,禁止用于任何非法用途。

资深全栈架构师,乐于在 CSDN 分享技术见解,与大家携手共进,共攀技术巅峰! 3941

数据分析python代码开发工程化编写逻辑-个人总结

团队开发 git提交 提交方法 注意细节 Byte-compiled / optimized / DLL files C extensions Distribution / packaging PyCharm files Jupyter Notebook Unit test / coverage reports Sphinx documentation Django Flask :thinking:协同开发 细节 模块管理 根目录 train.py pred.py data 配置 argparse yaml

ngadminq的博客 1626

【玩转GIS开发】3 - 创建Python工程,包括控制台和基于QT的图形化应用(提供标准开发模板)

本节主要介绍创建python工程的相关知识,全是干货。

gotofor的博客 610

python基础教程】3

python工程化python的爬虫基础内容,python的后端基础内容,浏览器f12控制台解释,fastapi使用教程,爬虫的hello world

l202226的博客 1439

Python能做大项目(2) -开发环境构建

尽管条条道路通罗马,但毕竟有的路走得更平稳更快捷,更不要说有的人甚至就住在罗马。对于 Python 开发而言,你的开发环境有多好用,你离罗马就有多近。因此,我们的旅程从这里开始。 本章首先介绍 Python 开发的操作系统环境,然后介绍几个最流行的集成 IDE,并对他们的特点进行了比较,供读者选择。

量化风云 937

Python 工程化最佳实践:从 “玩具代码“ 到 “生产级项目“ 的完整指南

本文介绍了将Python代码从"玩具项目"升级为"生产级系统"的完整工程化实践指南。主要内容包括: 项目结构规范:推荐PEP 420标准的src隔离结构,实现模块化设计和高内聚低耦合原则。 开发工具链:对比不同依赖管理工具,推荐使用PDM或Poetry管理依赖,并整合ruff、mypy等代码质量工具。 质量保障体系:强调类型提示的重要性,提供pytest测试最佳实践,以及GitHub Actions CI/CD集成方案。 错误处理规范:建议自定义异常体系、链式异常处理

weixin_62242812的博客 641

Python模块与包:从基础到工程化管理的完整指南

作为一名Python开发者,模块(Module)与包(Package)是我们每天都要打交道的概念。但你真的了解它们的全部奥秘吗?本文将带你从基础用法到工程实践,全面掌握Python模块化开发的精髓!模块就是一个.py文件,它可以包含:函数定义类定义变量可执行代码# calculator.py 模块文件"""简易计算器模块""""""加法运算""""""阶乘计算"""# 模块自测试代码print(f"5!= {factorial(5)}") # 当直接运行时输出:5!= 120命名规范。

qq_63910171的博客 793

如何在现有 Scrapy 项目中用 scrapling_response 装饰器接入 Scrapling 解析 API

如果你已经有一个 Scrapy 项目,但希望爬虫里的解析代码改用 Scrapling 的 API(`find_by_text`、`find_similar`、`get_all_text` 等),Scrapling 提供了专门的 Scrapy 集成:把 `scrapling_response` 装饰器加到 spider 回调上,回调里的 `response` 参数就会自动从 Scrapy 的响应对象

gitblog_00309的博客 784

Python Guide:一份长期维护的最佳实践手册

Python最佳实践手册:Real Python团队维护的29.6k星指南》摘要: Real Python团队维护的python-guide项目在GitHub获得29,643星,是一份覆盖Python开发全链路的最佳实践手册。该指南提供操作系统级别的安装指引、虚拟环境配置、包管理技巧,以及科学计算、Web开发、测试部署等场景的标准化方案。采用模块化结构设计,支持按需查阅,既适合新手建立规范,也能帮助经验开发者验证技术选型。项目提供在线文档(docs.python-guide.org)和本地源码两种形式,由

technexus83998的博客 238

如何为EinsteinPy贡献代码?开发者贡献指南最佳实践

EinsteinPy是一个专注于爱因斯坦场方程和相对论天体物理学的Python核心包,为开发者和研究者提供了强大的数值计算和符号计算工具。本指南将帮助你快速掌握贡献代码的完整流程,从环境搭建到PR提交,轻松成为开源贡献者! ## 为什么选择贡献EinsteinPy? 作为一个活跃的开源项目,EinsteinPy欢迎各种形式的贡献。无论是修复bug、添加新功能、改进文档,还是编写教程,你的每一份

gitblog_00709的博客 663

如何用革命性Python指南python-guide掌握Scrapy分布式爬虫开发:从入门到精通的完整教程

GitHub 加速计划 / py / python-guide 是一份为人类编写的 Python 最佳实践指南,其中涵盖了丰富的 Python 应用场景知识,对于学习 Scrapy 分布式爬虫开发具有极大的指导价值。 ## 为什么选择python-guide学习Scrapy分布式爬虫? python-guide 作为 Python 最佳实践指南,其内容系统且专业,能帮助开发者少走弯路。在爬虫开

gitblog_00756的博客 444

如何用Python指南python-guide实现机器人控制与自动化:从入门到精通的完整教程

Python指南python-guide)是一份为人类编写的Python最佳实践指南,它不仅涵盖了Python编程的基础知识,还提供了丰富的实战场景和最佳实践。本教程将带你探索如何利用这份指南中的知识,快速掌握机器人控制与自动化的核心技能,让你的Python项目更高效、更可靠。 ## 为什么选择Python进行机器人控制与自动化? Python凭借其简洁的语法、丰富的库支持和强大的社区,成为

gitblog_00614的博客 402

Backstage 架构决策记录解读:ADR003 为何弃用默认导出(Default Exports)并全面采用具名导出

本文深度解析 Backstage 项目架构决策记录(Architecture Decision Record,ADR)中的 [ADR003:Avoid Default Exports and Prefer Named Exports](https://link.gitcode.com/i/793492b7d91b35ec2453efb06dc7c86e)。Backstage 是一个用于构建开发者门

gitblog_00595的博客 371

ruflo-cost-tracker 的 cost-compact-context 技能:用 ReasoningBank 压缩上下文与 Token 节省实战指南

本文讲解 ruflo 生态中 `ruflo-cost-tracker` 插件的 `cost-compact-context` 技能:它如何封装 `@claude-flow/integration` 提供的 `getTokenOptimizer().getCompactContext()`,在成本分析查询时用语义检索压缩 prompt 上下文、报告桥接层给出的 token 节省量,并在 `agent

gitblog_00540的博客 482

文本分析项目部署与验证指南:从NLP原理到工程实践

自然语言处理(NLP)作为人工智能的核心分支,其核心原理是通过算法模型理解、解释和生成人类语言。在技术实现上,通常基于预训练模型进行文本的向量化表示与特征提取,进而完成情感分析、实体识别等任务。这一技术的核心价值在于将非结构化文本转化为结构化数据,极大提升了信息处理效率与规模。在应用场景上,NLP技术广泛应用于舆情监控、内容审核、市场研究等领域,为自动化决策提供数据支撑。本文以“Commentary on N Guilty Men”这类典型的文本分析项目为例,深入探讨其部署验证流程,涵盖了从环境准备、服务启

weixin_33800463的博客 335

Python 项目文件组织与工程化实践

本文系统梳理了 Python 项目的文件组织与工程化实践方法。内容涵盖单文件职责、模块拆分、包结构设计、可执行入口管理、配置分离、测试体系构建以及常见项目结构范式。通过分析常见错误和重构策略,文章提炼出跨项目适用的最佳实践与设计心法,强调结构应服务变化、入口与配置可控、测试可验证、依赖单向分层,为开发者提供可维护、可扩展、可测试的工程化指导。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 5万+

Python 项目工程化最佳实践

你好,我是坚持分享干货的 EarlGrey,翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。如果我的分享对你有帮助,请关注我,一起向上进击。转自:Python 猫,英文作者:Qin,原文链接:https://www.qin.news/python/最近在公司内部开发一个很有意思的项目,就是我之前发的那篇文章中描述的一个不需要 controller 的下一代服务端开发...

codingpy的博客 424
上一篇: 用 Python 脚本实现电脑唤醒后自动拍照 截屏并发邮件通知
下一篇: Python3搭建gRPC服务(入门版)
Python_P叔
博客等级 码龄3年 5374粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值