使用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使用pil生成缩略图的方法
Mar 26 Python
Python线程的两种编程方式
Apr 14 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
Jan 08 Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
Python八皇后问题解答过程详解
Jul 29 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
python代码区分大小写吗
Jun 17 Python
pytorch查看模型weight与grad方式
Jun 24 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
基于python的opencv图像处理实现对斑马线的检测示例
Nov 29 Python
Django + Taro 前后端分离项目实现企业微信登录功能
Apr 07 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实现约瑟夫问题的方法小结
2015/03/23 PHP
深入理解PHP内核(一)
2015/11/10 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
小试JQuery的AutoComplete插件
2011/05/04 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
微信小程序解析富文本过程详解
2019/07/13 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
Django安装配置mysql的方法步骤
2018/10/15 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
Django serializer优化类视图的实现示例
2020/07/16 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
物流仓储计划书
2014/01/10 职场文书
期末考试动员演讲稿
2014/01/10 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
农村党员对照检查材料
2014/09/24 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
2014年度思想工作总结
2014/11/27 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis