python中util是哪个包_使用Python的package机制如何简化utils包设计详解
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行 )。所以我们的目录结构会是这样的:
调用者怎么使用呢?from utils.a_util import AUtils
这种方式有一个假定:调用者要很清楚他所需要的 Utils 位于哪个 py 文件中。但是这种假定并不总是成立,大家对于同一概念的理解,极有可能是千差万别的。比如 utils,你觉得叫做 utils 合适,别人还觉得叫做 tools 合适呢,其实都是同一个东西。
显然,这加重了调用者的心智负担。更加显然的是,作为库作者,我们有义务来优化调用者的使用体验!(不然你的库再牛逼,没有人爱用也是空弹琴。)
HOW
合理利用 package 机制,就能马上优化这一体验。
我们只要在 __init__.py 中这么写即可:
调用者则仍然是这么使用:
即:调用者根本不关心你的实现在哪里,你只要给我一个 utils 的命名空间即可,而且确保所有的 Utils 都在这个命名空间里面。
为了更加符合 PEP8 的规范,作为库作者,我们的目录结构可能会变成这样:
应用
不仅是对于 utils 包,对与 constants 包,exceptions 包也可以应用此方法。在许多开源库中,大牛们经常使用这一手法来优化我们的体验(太常见了,几乎大部分开源库的 __init__.py 中都会写东西)
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://juejin.im/post/5a2cfc4f6fb9a044ff316588
python中util是哪个包_使用Python的package机制如何简化utils包设计详解相关推荐
- python中的utils模块_使用Python的package机制如何简化utils包设计详解
package 机制 package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件.当解释器发现目录下有这个文件时,他就会认为这是一个Package,而不是一个 ...
- python中numpy数组的合并_基于Python中numpy数组的合并实例讲解
基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...
- python中使用grpc方法示例_在Python中使用gRPC的方法示例
本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下: 使用Protocol Buffers的跨平台RPC系统. 安装 使用 pip pip install grpcio pip i ...
- python中mod是什么意思_【python中,mod_python到底做了些什么呢?】mod python 教程
python 编程小白 ,不会用doctest 请大神指教怎么用!! >>> >>> def is_between(v, lower, higher): ... ...
- python中二进制和文本不同_关于Python字符编码与二进制不得不说的一些事
二进制 核心思想: 冯诺依曼 + 图灵机 电如何表示状态,才能稳定? 计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性, 简单始终是建立再稳定.可靠基础上 经过尝试10进制,但 ...
- python中setup是什么意思_『Python』setup.py简介
setup.py应用场合 网上见到其他人这样介绍: 假如我在本机开发一个程序,需要用到python的redis.mysql模块以及自己编写的redis_run.py模块.我怎么实现在服务器上去发布该系 ...
- python中怎样使用re模块_[转]Python中RE模块的应用
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 Emecs 风格的模式.Emacs 风格模式可读性稍差 ...
- python中sample是什么意思_基于Python中random.sample()的替代方案
python中random.sample()方法可以随机地从指定列表中提取出N个不同的元素,但在实践中发现,当N的值比较大的时候,该方法执行速度很慢,如: numpy random模块中的choice ...
- python中的class怎么用_对python 中class与变量的使用方法详解
python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...
最新文章
- 【hard】146. LRU Cache
- DOM操作中,遍历动态集合的注意事项。ex: elem.children
- pmbook 知识领域 第六版_PMP项目管理10大知识领域脑图
- 计算机专业毕业求职,计算机专业毕业生求职简历
- 数据库原理及应用【二】数据模型
- 【华为云技术分享】【开发记录】Linux服务器维护常用命令(二)
- 做工程为什么不用python_为什么“python setup.py sdist”在项目根目录中创建不需要的“PROJECT-egg.info”?...
- cisco设备vlan,trunk,以太网通道管理
- 特征的标准化和归一化
- Qt_ios使用本地资源图片
- HP惠普打印机双面打印及常规操作
- 数据分析思维(极客时间)
- 捷讯fw300r虚拟服务器口号,迅捷FW300R开启UPnP功能
- 布尔逻辑代数化简公式
- 计算机专业与等差数列的联系,数列期末复习
- 为什么新品发布上架之后会没有流量,新品应该怎么发布?
- 简要说明人工智能专业以及就业前景
- AccessibilityService——实现微信切换账号功能
- 关于苹果开发者账号应用的那些事
- JavaScript--键盘控制div移动
热门文章
- 自己电脑服务器地址的查询办法
- JAVA新生入学报到管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
- 读“人生有一种牛逼,叫我能背下来”
- 编程的宗派(OOP与FP孰优孰劣)--王垠
- Python必会的12道面试题,看看你会几题?
- Flutter高德地图系列——开篇
- JSP中response.sendRedirect()与request.getRequestDispatcher().forward(request,respon 区别
- 信息与计算机科学就业如何,信息与计算科学专业就业情况怎么样
- 将文本保存为TXT文档
- 银行客户违约信息分析(数据挖掘)