【Python程序设计】 项目的最佳实践【03/8】

一、说明

        我们涵盖了 9 个最佳实践和示例,帮助您构建项目以实现协作和生产力。 以下文章是有关 Python 数据工程系列文章的一部分,旨在帮助数据工程师、数据科学家、数据分析师、机器学习工程师或其他刚接触 Python 的人掌握基础知识。迄今为止,本初学者指南包括:

        Python是一种通用且被广泛采用的编程语言,用于从数据分析到Web开发的所有内容。但是,随着 Python 项目复杂性的增加,跟踪所有移动部件并确保一切井井有条可能变得具有挑战性。

        这就是了解 Python 文件结构的用武之地。在本文中,我们将回顾构建 Python 项目的一些关键概念以及如何最好地应用它们。

如果你刚刚起步,这些最佳实践不仅可以帮助你编写更好的代码,还可以帮助你更好地维护和扩展 Python 代码库或数据管道。

目录

  • 为什么要拆分您的项目?
  • 构建 Python 项目的 9 个最佳实践
  • 演示:一个简单的数据工程项目
  • 构建项目以便于协作
  • Python 项目文件夹结构和密钥文件

二、为什么要拆分您的项目?

        随着Python程序变得越来越大,它们变得越来越难以管理。如果团队正在项目上进行协作并同时对项目的多个方面进行更改,则尤其如此。

        为了使项目更易于管理和维护,我们将大型、笨拙的编程任务分解为更易于管理的子任务或模块。顾名思义,模块可以在多个地方重用。

        将项目分解为模块称为“模块化编程”。如前面的文章所述,函数、模块和包都是模块化编程中使用的机制。模块化编程提供了许多优点。

  1. 它允许您一次专注于一个模块来简化您的工作
  2. 它使您的项目更易于维护。 如果团队正在共同处理一个项目,则采用模块化方法可以降低您的工作最终导致版本冲突的可能性。
  3. 它使您的代码更可重用。 如果你的项目是一个大型的单体,任何想要重用它的人都必须解析大量代码。如果代码按模块进行组织,则仅导入所需的部件会变得更容易。
  4. 它减少了重复。 根据上述观点,模块化代码更具可重用性,这意味着您最终复制函数的可能性较小。
  5. 它有助于避免命名空间冲突,因为每个模块都可以定义一个单独的命名空间。

三、构建 Python 项目的 9 个最佳实践

当你在网上寻找关于如何组织和编写Python代码的建议时,你会发现很多不同的想法。但实际上,它归结为一些基本的事情。

3.1. 组织代码

        在处理项目时,正确组织代码至关重要。首先,您可以为项目的不同部分创建单独的文件夹,例如一个用于代码本身,一个用于数据,一个用于测试,一个用于文档。这将帮助您更快地找到所需的内容,并使其他人更容易浏览您的代码。

3.2. 使用一致的命名

        在整个项目中为文件和文件夹使用一致的名称非常重要。尝试遵循约定,例如对变量和函数使用下划线,对类使用大写字母。这将使阅读和理解代码变得更加容易。

3.3. 使用版本控制

        即使在单独工作时,使用像 Git 这样的工具来跟踪对代码的更改也是推荐的最佳做法。它允许您记录更改,并轻松地将工作备份到基于云的存储库。大多数基于云的 Git 解决方案都为独立从业者提供免费层。

3.4. 使用包管理器

使用像 pip 这样的包管理器来管理依赖项将帮助您安装和跟踪项目需要运行的所有不同软件。在处理具有许多依赖项的大型项目时,这一点尤其重要。

3.5. 创建虚拟环境

若要使项目与计算机上的其他项目隔离,可以使用虚拟环境。这将防止不同项目中使用的包之间的冲突。

3.6. 注释您的代码

添加注释来解释您的代码正在做什么以及如何使用它对于使您的代码更易于其他人访问非常重要。它还可以帮助您记住编写代码时的想法。

3.7. Test, test, test

Using automated tests to check that your code works as expected is essential for catching bugs early on. This will save you time and prevent issues down the line.

3.8. 绒毛和风格

使用 Ruff 或 Flake8 等工具来确保您的代码看起来一致并捕获常见错误将帮助您编写更好的代码。这些工具检查您的代码是否与官方 Python 风格指南 PEP 8 保持一致。还可以使用 Black 等工具来确保代码在整个项目中看起来相同。这将帮助您保持一致性,并使其更易于阅读和理解您的代码。

3.9. 打包分享

使用像setuptools这样的工具来打包和分发你的Python代码将更容易与他人分享你的工作。这也将有助于确保其他人可以使用你的代码而不会遇到任何问题。

四、演示:一个简单的数据工程项目

        让我们将这些技巧应用于一个动手示例。我们将使用几种最佳做法,包括有组织的代码、一致的命名、有用的注释和测试。

        我们将编写一个脚本来从数据库中提取数据,对其进行转换,然后将其加载到另一个数据库中。让我们首先在名为 my_module.py 的模块中定义变量和函数:

# Constants
SOURCE_DB = "source_db"
DESTINATION_DB = "destination_db"
TABLE_NAME = "table_name"
DATE_COLUMN = "date_column"
SALES_COLUMN = "sales_column"# Functions
def extract_data(table_name):# Code to extract data from the source databasedef transform_data(data_frame):# Code to transform the datadef load_data(data_frame):# Code to load the data into the destination database

在此示例中,我们对变量和函数使用一致的名称。像 、 、 和 等常量都大写并用下划线分隔。像 、 和 这样的函数都是小写的,用下划线分隔。SOURCE_DBDESTINATION_DBTABLE_NAMEDATE_COLUMNSALES_COLUMNextract_datatransform_dataload_data

接下来,让我们在文件中编写一个简单的单元测试,以确保我们的代码按照我们想要的方式工作:test.py

import unittest
import pandas as pd
from my_module import transform_dataclass TestDataTransformation(unittest.TestCase):def test_transform_data(self):# Create a sample input DataFrameinput_data = pd.DataFrame({"date_column": ["2022-01-01", "2022-02-01", "2022-03-01"],"sales_column": [100, 200, 300]})# Call the transform_data functionoutput_data = transform_data(input_data)# Check the output DataFrameexpected_output = pd.DataFrame({"year": [2022, 2022, 2022],"month": [1, 2, 3],"sales": [100, 200, 300]})pd.testing.assert_frame_equal(output_data, expected_output)

在这里,我们导入了 and 模块,以及来自unittestpandastransform_datamy_module.py.

然后,我们定义了一个名为的测试类,它继承自 .在此类中,我们定义了一个名为 的单个测试函数。此函数创建一个包含三行数据的示例输入数据帧,使用此输入数据调用该函数,然后检查输出数据帧以确保它具有预期值。TestDataTransformationunittest.TestCasetest_transform_datatransform_data

我们使用相同的三行数据定义预期的输出数据帧,并使用该函数检查输出数据帧是否与预期的数据帧匹配。如果输出数据帧与预期数据帧匹配,则测试将通过。否则,测试将失败,并提供有关不匹配发生位置的信息。pd.testing.assert_frame_equal

五、构建项目以便于协作

与其他开发人员一起编写代码时,要考虑的最重要的事项是:

  • 确保您拥有正确的代码版本,并且
  • 正确的软件依赖项

这就是版本控制派上用场的地方。假设一个开发团队正在开发一个涉及开发 Web 应用程序的 Python 项目。每个开发人员都在处理项目的特定功能或模块。如果没有版本控制,团队将不得不手动协调他们的工作,这可能令人生畏且容易出错。一个开发人员可能会意外地覆盖另一个开发人员的工作,从而导致进度丢失或冲突。

但是,通过使用 Git 等版本控制系统,团队可以轻松跟踪更改、协作处理代码,并确保每个人都使用相同版本的代码库。使用 Git,每个开发人员都可以在自己的分支上工作,这允许他们独立进行更改,而不会影响主代码库。

当需要集成每个人的更改时,Git 提供了用于合并代码和解决冲突的工具,使团队更容易协同工作。Git 还提供了代码库的完整历史记录,包括每个开发人员所做的所有更改,这对于调试和了解代码如何随时间演变非常有用。

为了确保对共享代码的更改不会破坏其他项目,最好使用 pytest 等自动化测试工具。在将代码更改合并到主代码库之前查看代码更改也是一种很好的做法。

最后,当涉及到“轻松协作”时,正如我们的最佳实践列表中提到的,在编写代码时记录代码非常重要。这使新团队成员更容易理解代码并加快速度。

六、Python 项目文件夹结构和密钥文件

        您可能想知道为什么 Python 项目具有结构 .这种组织项目的方式在 Python 中很流行,因为它有助于保持一切整洁。顶部文件夹称为“my-project”,类似于整个项目的主文件夹。使用破折号和下划线有助于区分项目的两个级别。特别是,下划线有助于将项目引用与可能使用虚划线符号的变量或函数名称区分开来。因为破折号也是一个减号,所以定义 python 包的“内部级别”必须使用下划线。my-project/my_project

        关于如何在“我的项目”中组织文件,有松散的规范。顶层通常包含一个文件和各种配置文件。项目中最重要的部分是它包含的一个或多个 python 包。python 包是一个目录,构成 Python 导入系统的有效目标,通常包含一个文件。在此示例中,有一个名为“my_project”的 Python 包,它位于顶层。README.md__init__.py

从这里开始,在大多数项目中找到的关键文件和子文件夹是:

  • 依赖项管理文件(通常为 或 )此文件用于配置项目及其依赖项。我们在本博客系列的第二部分中探讨了依赖关系管理。setup.pypyproject.toml
  • README.md:此文件以 markdown 形式编写,简要介绍了您的项目、其用途以及任何安装或使用说明。
  • LICENSE:此纯文本文件指定发布代码的许可证。有许多开源许可证可供选择,因此请务必选择适合您需求的许可证。

此外,许多项目将具有以下两个文件夹:

  • src/:此目录是 python 包的替代位置,如果您不想将它们直接放在项目根目录中。
  • tests/:此目录包含验证项目功能的测试代码。您可以使用 pytest 或 unittest 等测试框架来编写和运行测试。

接下来...

我们已经分享了随着项目复杂性的增加,以结构化的方式组织 Python 项目的重要性,特别是如果您是团队的一员或计划与其他开发人员共享您的工作。通过遵循本文中概述的最佳做法,可以更轻松地维护和缩放基本代码或数据管道。

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

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

相关文章

2023国赛数学建模C题模型代码

C题代码全部都完成了,可以看文末名片 我们先看C题的一个背景 在生鲜商超中,蔬菜类商品保鲜期短,且品相会随销售时间增加而变差。商超需要根据历史销售和需求每天进行补货。由于蔬菜品种众多、产地不同,补货时间在凌晨,商家须在不明确具体单品和价格的情况下进行补…

如何排查网站及APP数据泄露的源头

近年来数据泄露安全事件频发,在今年的hw网络安全攻防演练中,获取敏感信息、数据泄露等漏洞的得分也越来越高,我们SINE安全近十年来成功的帮助了许多客户,查找到了数据泄露的原因,在这里向大家分享我们的经验与心得&…

端口已被占用

报的错误 Exception in thread "Thread-76" java.net.BindException: Address already in use: bindat sun.nio.ch.Net.bind0(Native Method)at sun.nio.ch.Net.bind(Net.java:433)at sun.nio.ch.Net.bind(Net.java:425)at sun.nio.ch.ServerSocketChannelImpl.bind…

实相融、云启未来,智慧公厕让城市生活更美好

现代社会,随着科技的不断发展,人们对于城市生活的要求也在不断提升。在这个过程中,智慧公厕作为城市基础设施中的重要组成部分,正在发挥着越来越重要的作用。通过数字化、云管理、人工智能等未来的科技方式,智慧公厕为…

Acwing算法心得——街灯(差分)

大家好,我是晴天学长,差分广泛用于一段范围的加减运算,可以优化时间复杂度,需要的小伙伴请自取哦!如果觉得写的不错的话,可以点个关注哦,后续会继续更新的。💪💪&#x1…

审计智能合约的成本是多少?如何审计智能合约?

审计智能合约的成本是多少?如何审计智能合约? 智能合约安全审计在去中心化金融 (DeFi) 生态系统中非常普遍。如果您投资了一个区块链项目,您的决定可能部分基于智能合约代码审查的结果。 虽然大多数人都了解审计对网络安全的重要性&#xff…

计及电池储能寿命损耗的微电网经济调度(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型,以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数,创新考虑储能寿命损耗约束、放电深度约束和储能循环次…

为什么零基础选择语言首选python

在众多编程语言中,似乎已经没有什么能够阻挡Python的步伐。本月Python又是第一名,市场份额达到了13.42%,在2023年,Python已经连续7个月蝉联榜首,遥遥领先于其他对手。 每个月榜单发布后,都有小伙伴会好奇&…

数学建模竞赛常用代码总结-PythonMatlab

数学建模过程中有许多可复用的基础代码,在此对 python 以及 MATLAB 中常用代码进行简单总结,该总结会进行实时更新。 一、文件读取 python (pandas) 文件后缀名(扩展名)并不是必须的,其作用主要一方面是提示系统是用…

【计算机视觉】图片文件格式的讲解

文章目录 一、图片的压缩二、计算机表示颜色三、JPG和PNG3.1 JPG3.2 PNG 一、图片的压缩 图片文件格式有可能会对图片的文件大小进行不同程度的压缩,图片的压缩分为有损压缩和无损压缩两种。 有损压缩。指在压缩文件大小的过程中,损失了一部分图片的信…

Scrum联盟权威认证CSM<ScrumMaster>官方认证课

课程简介 Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架,旨在最短时间内交付最大价值。根据2021年全球敏捷状态报告,Scrum及Scrum衍生方法的应用占比达到81%。 在企业的敏捷转型历程中,Scru…

每日一题(设计循环队列)

每日一题(设计循环队列) 622. 设计循环队列 - 力扣(LeetCode) 1.题意解读 本题只能为队列开辟k个单位空间,并且只能利用这几个空间进行数据的存储。 思路:本题使用数组来实现队列是比较方便的&#xff0c…

网络是如何进行通信

网络是如何进行通信的 简介 在现代社会中,网络已经成为我们生活中不可或缺的一部分。从上网搜索信息、在线购物到远程工作和社交媒体,我们几乎无时无刻不与网络保持着联系。但是,网络究竟是个什么玩意,它是如何工作的呢&#xf…

OpenCV 01(图像加载与显示)

一、机器视觉 现在说的机器视觉(Machine Vision)一般指计算机视觉(Computer Vision), 简单来说就是研究如何使机器看懂东西。就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传…

道一云·七巧对接打通金蝶云星空查询七巧表单接口与供应商新增接口

道一云七巧对接打通金蝶云星空查询七巧表单接口与供应商新增接口 数据源平台:道一云七巧 道一云七巧拥有强大的自定义表单设计工具,并配置工作流程,通过流程智能流转,打通各个业务场景中的审批、协作环节,包含数据采集单、任务单…

C++学习第二十一天----函数

1.写入到文本文件中 第二十天说了如何声明自己的ofstream对象,为其命名,并将其同文件关联起来,最后使用完毕后,应该将其关闭; //这并不一定必须有,但是最好有; outFile.close();程序中有这样一…

C#使用DataTable的Select方法来选择特定的字段

在C#中,可以使用DataTable的Select方法来选择特定的字段。要选择特定的字段,可以使用Select方法的参数来指定要返回的列的名称,然后将结果存储在一个新的DataTable中。以下是一个示例: using System; using System.Data; class …

用于独立系统应用的光伏MPPT铅酸电池充电控制器建模(Simulink实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【0906 C高级day1】 Linux中的文件相关指令

一、使用cut截取出Ubuntu用户的家目录,要求:不能使用":"作为分割 grep "ubuntu" /etc/passwd | cut -d "/" -n -f 2-3 | cut -c 1-11 二、思维导图 文件相关指令:

WordPress(5)在主题中添加文章字数和预计阅读时间

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 样式图一、添加位置二、找到主题文件样式图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 二、找到主题文件 在主题目录下functions.php文件把下面的代码添加进去: // 文章字数…