基于 cookiecutter 的 python 项目模板
Cookiecutter 介绍
使用 Python 这种动态语言进行 web 开发,团队中经常会遇到的问题就是代码的质量比较难控制。Python 语言本身灵活性比较高,不加控制的情况下代码质量可能最后很难维护。而且代码的各方面的标准,比如提示的 lint,代码格式化等等如果不加规范,不同开发者的协作也会比较困难。因此从公司角度来看,一个统一的代码规范是很有必要的。
在 Python 的开发过程中,可以选择公司希望遵循的 Python 开发相关的规范,那么如何更好地将这些规范组织起来呢?
一个比较好的方案就是 cookiecutter,cookiecutter 是一个用于构建工程模板的 python 库,利用 cookiecutter 可以构建一个标准统一的起步 python 项目,同时在构建中还具备一定的灵活性,根据自己需要选择合适配置。下面就对 cookiecutter 进行简要介绍:
Cookiecutter 简单实践
Cookiecutter 是一个跨平台的 Python模板组织工具,可以极其简单地生成一个 Python 起步项目。
使用前需要先安装 cookiecutter,各种安装方式都是支持的,Mac 上可以通过 brew
或者 pip
安装。
首先你需要寻找符合你要求项目模板,在 github 上通过 cookiecutter 进行搜索即可找到大量的备选模板,我们这边以 cookiecutter 官方维护的一个模板 cookiecutter-pypackage 为例进行介绍,找到此模板对应的地址 https://github.com/audreyfeldroy/cookiecutter-pypackage
之后直接执行 cookiecutter https://github.com/audreyfeldroy/cookiecutter-pypackage
即可,在执行中会有一些可供选择的配置型,如果不确定可以使用默认值,一路确认下来,你需要的起步项目就完成了。
如果此模板不能完成满足你的需要,你可以选择在构建完成后对工程进行小幅修改,如果需要将此模板推广给全公司使用,直接基于此模板构建一个新的模板进行修改,之后再重新生成工程即可。
Cookiecutter 模板
下面可以对 cookiecutter 模板的组织结构进行简单介绍:
cookiecutter-something/
├── {{ cookiecutter.project_name }}/ <--------- 项目模板,生成的工程就是这个目录下内容
│ └── ...
├── blah.txt <--------- 模板工程之外的文件
│
└── cookiecutter.json <--------- 提示以及默认值的配置文件,可变的变量都存储在这个文件中
通过上面的模板可以生成项目模板目录下的内容,项目的变量名会被输入的内容替换。
另外 cookiecutter 还支持一些更高级的功能,比如前置或后置的检查 Hooks,以及注入实时上下文等,可以根据自己需要进行使用
一个合适的项目模板
对于公司而言,有一个标准的项目规范,可以帮助大家统一代码风格,提高整体的代码质量,我们参考了各家的标准化建议,最终提出了一个合适的代码规范,主要包含下面的一些部分:
lint
lint 是用于检测代码,有助于团队规则的统一,同时借助 lint 可以规避一些常见的坑。我们最终选择的 lint 是:
- pylint pylint 基本上是 python 的 lint 中最常见的 lint 了,限制也比较严格,我们根据需要关闭了
"missing-docstring"
,"logging-fstring-interpolation"
- mypy 此 lint 是 python 中常见的类型检查 lint,通过此 lint 要求方法指定参数的类型
代码格式化
代码格式化是用于保证代码风格的统一,代码的格式化也存在多种选择,我们最终选择了:
- black 这个格式化工具的有名之处在于可配置项比较少,基本上通过去除灵活性来换取高度统一性的代码风格,但是 black 竟然受到了大量 python 程序员的喜爱,可能是动态语言的灵活性让大家更想要某种确定的规范吧
- isort 这是用来调整 python 包的 import 顺序的,按照系统库,第三方库,本地库的顺序进行分开排布
单元测试
单元测试用于保证代码的正确性,我们选择了评价相对更好的:
- pytest 相对于默认的 unittest, pytest 显然更受欢迎,pytest 使用更加便利,同时不仅能支持单元测试,还能支持面向应用的测试
- coverage 我们使用 coverage 用于计算代码单元测试覆盖率,方便保证代码的充分测试
依赖管理
- requirements 在 python 项目中,比较常见的是通过 requirements.txt 进行管理,但是默认的包管理不支持管理直接依赖和间接依赖,因此需要通过 pip-compile 进行区分,而且开发相关的依赖也需要另外通过 requirements-dev.txt,这种管理方式比较不友好,但是考虑到大部分 python 程序员都熟悉这种情况,也可以提供了这种方式
- poetry 这是一种更新的包管理方式,可以比较好地组织好依赖关系,而且已经被纳入 PEP 518 标准了,建议优先采用此方式管理包。同时 poetry 也包含了虚拟环境的管理,使用更加便利
按照上面的规范最终构建的 cookiecutter 模板可以参考 github
更多模板
cookiecutter 的使用过程中,上手还是比较简单的,cookiecutter 无非是一个动态替换的机制,没有什么特殊的复杂性。从我的使用的感受来看,cookiecutter 的一个最大价值在于有大量的开发者已经提供了一些现成的工程模板,而且我们可以相对简单地通过已有的工程模板生成新的工程模板,并在团队内部统一规范。
可以参考 cookiecutter 提供的大量的代码模板根据自己的需要选择一个基础模板,然后进行必要的修改即可得到所需的上手代码模板。进而生成所需的项目工程。比如对于上面提供的项目模板,如果需要增加相关文档的支持,可以引入 Sphinx ,之后重新生成项目模板即可。
总结
从过往的经验来看,有两点总结:
- 项目规范化很有必要,统一的规范省心省力
- 不要重复造轮子,尽量使用成熟方案
使用 cookiecutter 就可以轻松实现
相关文章:
基于 cookiecutter 的 python 项目模板
Cookiecutter 介绍 使用 Python 这种动态语言进行 web 开发,团队中经常会遇到的问题就是代码的质量比较难控制。Python 语言本身灵活性比较高,不加控制的情况下代码质量可能最后很难维护。而且代码的各方面的标准,比如提示的 lint࿰…...

如何玩转澳大利亚Facebook直播?
近年来,直播带货已经成为国内最赚钱的行业之一,各种玩法也越来越成熟。然而,在海外市场,尤其是澳大利亚,直播带货仍然是一片蓝海。作为社交媒体营销的主阵地,Facebook的直播功能却常常被卖家忽视。那么&…...
C# IOC容器、依赖注入和控制反转
控制反转(Inversion of Control, IoC) 定义:控制反转是一种设计原则,它反转了传统编程中的控制流程。在传统的编程模式中,组件之间的依赖关系是由组件自身在内部创建和维护的。而在控制反转模式中,这种依赖…...

论文学习_An Empirical Study of Deep Learning Models for Vulnerability Detection
1. 引言 研究背景:近年来,深度学习漏洞检测工具取得了可喜的成果。最先进的模型报告了 0.9 的 F1 分数,并且优于静态分析器。结果令人兴奋,因为深度学习可能会给软件保障带来革命性的变化。因此,IBM、谷歌和亚马逊等行业公司非常感兴趣,并投入巨资开发此类工具和数据集。…...

ctfshow-web入门-文件上传(web166、web167)(web168-web170)免杀绕过
目录 1、web166 2、web167 3、web168 4、web169 5、web170 1、web166 查看源码,前端只让传 zip 上传 zip 成功后可以进行下载 随便搞一个压缩包,使用记事本编辑,在其内容里插入一句话木马: 上传该压缩包,上传成功…...
Jitsi Meet指定用户成为主持人
前言 在Jitsi Meet进行会议的时候,我们有可能会使用到预约会议的这一个功能,预约会议的时候,我们希望我预约的会议,我就是主持人,而不希望其他人是主持人。 但是Jitsi Meet默认会认为第一个进入房间的是主持人&#…...
MySQL慢查询日志详解与性能优化指南
1. 什么是慢查询日志 慢查询日志是MySQL提供的一种日志记录功能,它能够记录执行时间超过预设阈值的SQL查询语句,并将这些信息写入到日志文件中。 2. 查看慢查询日志的设置和状态 2.1 慢查询日志的开启状态和日志文件位置 通过以下命令可以查看慢查询…...
xml CDATA
]]>之间的任何内容标记为字符数据。内容不会被解释为标记。 <![CDATA[这里的任何文本,即使是也被解释为文本而不是起始标签]]> 这是什么意思? 这段描述解释了XML中CDATA部分的作用和用法。让我来详细解释一下: CDATA(Character Da…...
C++的线程管理
C的线程管理 线程类(Thread)线程构造器约定构造器初始化构造器复制构造器移动构造器 多线程atomiccondition_variable应用实列 futurepromise应用实列 future应用实列 线程类(Thread) 执行线程是一个指令序列,它可以在…...

捷配笔记-如何设计PCB板布线满足生产标准?
PCB板布线是铺设连接各种设备与通电信号的路径的过程。PCB板布线是铺设连接各种设备与通电信号的路径的过程。 在PCB设计中,布线是完成产品设计的重要步骤。可以说,之前的准备工作已经为它做好了。在整个PCB设计中,布线设计过程具有最高的极限…...

【Java数据结构】初识线性表之一:顺序表
使用Java简单实现一个顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 线性表大致包含如下的一些方法: public class MyArrayList { private int[] array; pri…...

对接高德开放平台API
高德开放平台API: https://lbs.amap.com/ 一、天气查询 天气查询: https://lbs.amap.com/api/webservice/guide/api/weatherinfo adcode城市码表下载: https://lbs.amap.com/api/webservice/download Component public class WeatherUtil {Resourceprivate GdCon…...

Linux 初识
目录 编辑 1.Linux发展史 1.1UNIX发展历史 1.2Linux发展历史 2.Linux的开源属性 2.1 开源软件的定义 2.2 Linux的开源许可证 2.3 开源社区与协作 3.Linux的企业应用现状 3.1 服务器 3.1.1 Web服务器 3.1.2 数据库服务器 3.1.3 文件服务器 3.1.4 电子邮件服务器 …...

CSS技巧专栏:一日一例 4.纯CSS实现两款流光溢彩的酷炫按钮特效
大家好,今天是 CSS技巧专栏:一日一例 第三篇《纯CSS实现两款流光溢彩的酷炫按钮特效》 先看图: 特此说明: 本专题专注于讲解如何使用CSS制作按钮特效。前置的准备工作和按钮的基本样式,都在本专栏第一篇文章中又详细…...

int类型变量表示范围的计算原理
文章目录 1. 了解2. 为什么通常情况下int类型整数的取值范围是-2147483648 ~ 21474836473. int类型究竟占几个字节4. 推荐 1. 了解 通常情况下int类型变量占4个字节,1个字节有8位,每位都有0和1两种状态,所以int类型变量一共可以表示 2^32 种状…...

STM32崩溃问题排查
文章目录 前言1. 问题说明2. STM32(Cortex M4内核)的寄存器3. 崩溃问题分析3.1 崩溃信息的来源是哪里?3.2 崩溃信息中的每个关键字代表的含义3.3 利用崩溃信息去查找造成崩溃的点3.4 keil5中怎么根据地址找到问题点3.5 keil5上编译时怎么输出…...

CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)
CSS 样式选择器,用于选中页面中的 html 元素,以便添加 CSS 样式。 按渲染性能由高到低 依次是: ID 选择器 #id 通过元素的 id 属性选中元素,区分大小写 <p id"p1" >第一段</p>#p1{color: red; }但不推荐使…...
CMakeLists.txt编写思路
近期在linux编写CMakeLists.txt文件,整理了一些思路。 一、编写CMakeLists.txt的基本步骤和思路: 初始化CMake: 使用cmake_minimum_required指令指定CMake的最小版本要求,以确保兼容性。使用project指令定义项目名称和可选的语言…...

红日靶场----(三)2.漏洞利用
上期的通过一句话木马实现对目标主机的持久后门 我使用的是蚁剑,蚁剑安装及使用参考: 下载地址: GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 安装即使用: 1. 快速入门 语雀 通过YXCMS的后台GETSHELL 利用…...
LeetCode HOT100(三)滑动窗口
子数组最大平均数 I (非hot100,但是滑动窗口的思想可以很好的体现,入门滑动窗口很好的题) 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

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

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...