使用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 相关文章推荐
videocapture库制作python视频高速传输程序
Dec 23 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
python正则分析nginx的访问日志
Jan 17 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
Jan 04 Python
python仿抖音表白神器
Apr 08 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
python+mysql实现个人论文管理系统
Oct 25 Python
python编写俄罗斯方块
Mar 13 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 Python
python else语句在循环中的运用详解
Jul 06 Python
python实现录制全屏和选择区域录屏功能
Feb 05 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.ini 中文版
2006/10/28 PHP
PHP实现变色验证码实例
2014/01/06 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
简单实现js浮动框
2016/12/13 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
2017/06/17 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
Python help()函数用法详解
2014/03/11 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
python实现LRU热点缓存及原理
2019/10/29 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
Python属性和内建属性实例解析
2020/01/14 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
试用期员工考核制度
2014/01/22 职场文书
目标责任书范本
2014/04/16 职场文书
工作分析计划书
2014/04/30 职场文书
保密工作承诺书
2014/08/29 职场文书
2014年法院工作总结
2014/11/24 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
优秀教师事迹材料
2014/12/15 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis