使用Python的package机制如何简化utils包设计详解


Posted in Python onDecember 11, 2017

package 机制

package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件。当解释器发现目录下有这个文件时,他就会认为这是一个Package,而不是一个普通的目录。

对于 package 机制的说明,其实官方文档已经有非常详尽的论述了,本文并不着眼于此。

简单来说,一个目录下如果包含 __init__.py ,则被 Python 视作一个 Python package。其中:

  • __init__.py 中的东西,在初始化这个包时,会首先被加载
  • package 中还可以定义 sub package

初衷

为了概念统一,我们把写代码的人,大致分为两种角色:

  • Library Author
  • Caller 即 API 使用者

有时候我们会是 1 或者 2, 有时候我们可能既是 1 又是 2 ( 比如负责一个较大的系统时)

很显然,本文的角度是从 1 出发的(即我们只扮演库作者,并且不知道我们的调用者是谁)。

最开始时,utils 可能仅仅是一个 utils.py 就可以了,然后调用者 from utils import XXUtils 就完事了,这自然没有本文什么事。

然而大部分情况不是这样的,所有 Utils 都放到一个文件里面是 stupid 的(一个源码文件最多 400~500行 )。所以我们的目录结构会是这样的:

utils/
 __init__.py
 a_util.py
 b_util.py
 ......

调用者怎么使用呢?from utils.a_util import AUtils

这种方式有一个假定:调用者要很清楚他所需要的 Utils 位于哪个 py 文件中。但是这种假定并不总是成立,大家对于同一概念的理解,极有可能是千差万别的。比如 utils,你觉得叫做 utils 合适,别人还觉得叫做 tools 合适呢,其实都是同一个东西。

显然,这加重了调用者的心智负担。更加显然的是,作为库作者,我们有义务来优化调用者的使用体验!(不然你的库再牛逼,没有人爱用也是空弹琴。)

HOW

合理利用 package 机制,就能马上优化这一体验。

我们只要在 __init__.py 中这么写即可:

__init__.py
from .a_util import AUtils
from .b_util import BUtils

调用者则仍然是这么使用:

from utils import AUtils, BUtils

即:调用者根本不关心你的实现在哪里,你只要给我一个 utils 的命名空间即可,而且确保所有的 Utils 都在这个命名空间里面。

为了更加符合 PEP8 的规范,作为库作者,我们的目录结构可能会变成这样:

utils/
 __init__.py
 _a_util.py    不对外界公开, 仅限本package的其他模块使用
 _b_util.py

应用

不仅是对于 utils 包,对与 constants 包,exceptions 包也可以应用此方法。在许多开源库中,大牛们经常使用这一手法来优化我们的体验(太常见了,几乎大部分开源库的 __init__.py 中都会写东西)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python文件读取的3种方法及路径转义
Jun 21 Python
python基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
深入解答关于Python的11道基本面试题
Apr 01 Python
Django admin美化插件suit使用示例
Dec 12 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
python 图片去噪的方法示例
Jul 09 Python
python计算n的阶乘的方法代码
Oct 25 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
Feb 17 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
Oct 10 Python
python timestamp和datetime之间转换详解
Dec 11 #Python
Python时间戳使用和相互转换详解
Dec 11 #Python
python的exec、eval使用分析
Dec 11 #Python
Python中eval带来的潜在风险代码分析
Dec 11 #Python
Python验证文件是否可读写代码分享
Dec 11 #Python
Python文件操作基本流程代码实例
Dec 11 #Python
Python使用Turtle模块绘制五星红旗代码示例
Dec 11 #Python
You might like
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
javascript 常用代码技巧大收集
2009/02/25 Javascript
用JavaScript隐藏控件的方法
2009/09/21 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
JavaScript函数详解
2015/02/27 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
python实现批量获取指定文件夹下的所有文件的厂商信息
2014/09/28 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
工业学校毕业生自荐信范文
2014/01/03 职场文书
小型女装店的创业计划书
2014/01/09 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
师范生小学见习总结
2015/06/23 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
python数字图像处理:图像的绘制
2022/06/28 Python
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang