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包设计详解相关推荐

  1. python中的utils模块_使用Python的package机制如何简化utils包设计详解

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

  2. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  3. python中使用grpc方法示例_在Python中使用gRPC的方法示例

    本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下: 使用Protocol Buffers的跨平台RPC系统. 安装 使用 pip pip install grpcio pip i ...

  4. python中mod是什么意思_【python中,mod_python到底做了些什么呢?】mod python 教程

    python 编程小白 ,不会用doctest 请大神指教怎么用!! >>> >>> def is_between(v, lower, higher): ...   ...

  5. python中二进制和文本不同_关于Python字符编码与二进制不得不说的一些事

    二进制 核心思想: 冯诺依曼 + 图灵机 电如何表示状态,才能稳定? 计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性, 简单始终是建立再稳定.可靠基础上 经过尝试10进制,但 ...

  6. python中setup是什么意思_『Python』setup.py简介

    setup.py应用场合 网上见到其他人这样介绍: 假如我在本机开发一个程序,需要用到python的redis.mysql模块以及自己编写的redis_run.py模块.我怎么实现在服务器上去发布该系 ...

  7. python中怎样使用re模块_[转]Python中RE模块的应用

    Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 Emecs 风格的模式.Emacs 风格模式可读性稍差 ...

  8. python中sample是什么意思_基于Python中random.sample()的替代方案

    python中random.sample()方法可以随机地从指定列表中提取出N个不同的元素,但在实践中发现,当N的值比较大的时候,该方法执行速度很慢,如: numpy random模块中的choice ...

  9. python中的class怎么用_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

最新文章

  1. 【hard】146. LRU Cache
  2. DOM操作中,遍历动态集合的注意事项。ex: elem.children
  3. pmbook 知识领域 第六版_PMP项目管理10大知识领域脑图
  4. 计算机专业毕业求职,计算机专业毕业生求职简历
  5. 数据库原理及应用【二】数据模型
  6. 【华为云技术分享】【开发记录】Linux服务器维护常用命令(二)
  7. 做工程为什么不用python_为什么“python setup.py sdist”在项目根目录中创建不需要的“PROJECT-egg.info”?...
  8. cisco设备vlan,trunk,以太网通道管理
  9. 特征的标准化和归一化
  10. Qt_ios使用本地资源图片
  11. HP惠普打印机双面打印及常规操作
  12. 数据分析思维(极客时间)
  13. 捷讯fw300r虚拟服务器口号,迅捷FW300R开启UPnP功能
  14. 布尔逻辑代数化简公式
  15. 计算机专业与等差数列的联系,数列期末复习
  16. 为什么新品发布上架之后会没有流量,新品应该怎么发布?
  17. 简要说明人工智能专业以及就业前景
  18. AccessibilityService——实现微信切换账号功能
  19. 关于苹果开发者账号应用的那些事
  20. JavaScript--键盘控制div移动

热门文章

  1. 自己电脑服务器地址的查询办法
  2. JAVA新生入学报到管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  3. 读“人生有一种牛逼,叫我能背下来”
  4. 编程的宗派(OOP与FP孰优孰劣)--王垠
  5. Python必会的12道面试题,看看你会几题?
  6. Flutter高德地图系列——开篇
  7. JSP中response.sendRedirect()与request.getRequestDispatcher().forward(request,respon 区别
  8. 信息与计算机科学就业如何,信息与计算科学专业就业情况怎么样
  9. 将文本保存为TXT文档
  10. 银行客户违约信息分析(数据挖掘)