Python项目结果布局
Python项目结构布局
- 项目名称
- 项目描述
- 一大堆文件
示例仓库
README.rst
LICENSE
setup.py
requirements.txt
sample/__init__.py
sample/core.py
sample/helpers.py
docs/conf.py
docs/index.rst
tests/test_basic.py
tests/test_advanced.py
-
README.rst: 项目的说明文档,通常包括项目的描述、用法、安装指南等。
-
LICENSE: 项目的许可证文件,说明项目的开源许可类型。
-
setup.py: Python包的安装和分发配置文件,通常包括项目的元数据和依赖项。
-
requirements.txt: 项目的依赖包列表,用于构建虚拟环境或部署项目。
-
sample/init.py: Python包的初始化文件,通常为空。
-
sample/core.py: 项目的核心代码文件,包含主要功能和类。
-
sample/helpers.py: 包含辅助功能的文件,可能被核心代码引用。
-
docs/conf.py: 项目文档的配置文件,通常与Sphinx文档生成工具一起使用。
-
docs/index.rst: 项目文档的主页,通常包括项目的概述和索引。
-
tests/test_basic.py: 项目的基本单元测试。
-
tests/test_advanced.py: 项目的高级单元测试,通常包括更复杂的测试用例。
main.py
或app.py
,以便用户可以运行您的应用程序。实际模块
./sample/
./sample.py
License
./LICENSE
Setup.py
./setup.py
setup.py
和其他项目文件按照规范放置,有助于项目的清晰性和易维护性,并使其对其他开发人员更加友好。Requirements文件
./requirements.txt
requirements.txt
文件包含了项目的依赖关系列表,包括运行时依赖和开发依赖。这个文件对于管理项目的依赖项非常有用,无论是在开发、测试还是部署阶段。如果您的项目没有开发依赖关系,或者更喜欢通过setup.py设置开发环境,则此文件可能没有必要。文件
./docs/
./docs/
目录用于存放项目的文档文件。这包括项目的参考文件、文档、用户手册、API文档等。文档对于项目的可维护性和可用性非常重要,因为它们帮助用户和其他开发人员了解如何使用和贡献项目。文档通常使reStructuredText(.rst)
或Markdown等标记语言编写。使用工具如Sphinx可以将这些标记转换为漂亮的HTML文档或其他格式的文档。测试单元
./test_sample.py
./tests/
./test_sample.py
tests/test_basic.py
tests/test_advanced.py
-
期望将该包安装在站点包中
-
使用一个简单的路径修改来正确地解析软件包
setup.py
开发来测试一个积极变化的代码库,还要求他们为代码库的每个实例有一个孤立的环境设置。若要提供单个测试的导入上下文,请创建一个tests/context.py
文件:import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
import sample
from .context import sample
- 用户的复杂性:用户安装模块时不应该受到测试的影响。
- 不必要的依赖关系:将测试与模块代码混合在一起可能会导致用户安装不必要的依赖关系,这可能会增加模块的大小和复杂性。
- 运行时上下文问题:测试通常需要特定的运行时上下文,例如测试数据库或外部服务。
Makefile
./Makefile
- 统一构建和测试任务:Makefiles允许您定义和管理项目中的常见任务,例如安装依赖、运行测试等。这使得开发者可以轻松地运行这些任务,确保项目的一致性和可重复性。
- 自动化流程:Makefiles可以自动化许多重复的任务,减少了手动操作的需求。这有助于提高开发效率和降低出错的风险。
- 易于维护:Makefiles是文本文件,易于编辑和维护。可以根据项目需求添加、修改或删除任务,而无需深入了解构建工具的内部工作原理。
- 良好的可移植性:Make是跨平台的工具,可以在多个操作系统上运行。这意味着Makefiles可以在不同环境中使用,而不需要重复编写任务。
- 社区支持:由于Makefiles在许多项目中广泛使用,因此存在大量的文档和示例,以帮助开发者使用它们。
manage.py
)或Fabric脚本。这些工具通常用于特定框架或库,以简化项目管理。选择使用哪种工具取决于项目的需求和开发团队的偏好。init:
pip install -r requirements.txt
test:
py.test tests
.PHONY: init test
manage.py
或fabfile.py
)也属于存储库的根目录。关于Django应用
$ django-admin.py startproject samplesite
README.rst
samplesite/manage.py
samplesite/samplesite/settings.py
samplesite/samplesite/wsgi.py
samplesite/samplesite/sampleapp/models.py
$ django-admin.py startproject samplesite .
.
,其结果结构:README.rst
manage.py
samplesite/settings.py
samplesite/wsgi.py
samplesite/sampleapp/models.py
代码的结构至关重要
-
多个混乱的循环依赖:如果
furn.py
中的Table
和Chair
类需要从workers.py
中导入Carpenter
来回答像table.isdoneby()
这样的问题,反之亦然,Carpenter
类需要导入Table
和Chair
来回答carpenter.whatdo()
这样的问题,那么就有了循环依赖。在这种情况下,将不得不采取脆弱的解决方案,例如在方法或函数内部使用导入语句。 -
隐藏的耦合:对
Table
实现的每一次更改都会破坏与其无关的20个测试用例,因为它会破坏Carpenter
的代码,需要非常仔细的手术来适应更改。这意味着对Carpenter
代码中对Table
的假设太多,或者反过来也是如此。 -
全局状态或上下文的大量使用:
Table
和Carpenter
不是显式地将(高度、宽度、类型、木材等)传递给对方,而是依赖于可以被不同的模块动态修改的全局变量。需要仔细审查对这些全局变量的访问,以了解为什么一个矩形桌变成了一个正方形,以及发现远程模板代码也在修改这个上下文,干扰了桌子的尺寸。 -
面条式代码(Spaghetti code):多页嵌套的if子句和for循环,带有大量复制粘贴的过程式代码,没有适当的分段,被称为面条式代码。Python的有意义的缩进(它最具争议的特性之一)使得维护这种代码非常困难。所以好消息是,可能不会经常遇到这种情况。
-
馄饨式代码(Ravioli code):它由数百个相似的小逻辑片段组成,通常是类或对象,没有适当的结构。如果永远不记得是否要使用
FurnitureTable
、AssetTable
还是Table
,甚至是TableNew
来完成手头的任务,那么可能正在应对Ravioli代码。这意味着代码可能过于碎片化,需要更好的组织和结构。
作者: UncleLLD 发表日期:2023 年 11 月 3 日