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中的utils模块_利用 Python 的 package 机制简化 utils 包设计相关推荐

  1. python中什么是数据驱动_利用Python如何实现数据驱动的接口自动化测试

    前言 大家在接口测试的过程中,很多时候会用到对CSV的读取操作,本文主要说明Python3对CSV的写入和读取.下面话不多说了,来一起看看详细的介绍吧. 1.需求 某API,GET方法,token,m ...

  2. python中的pil模块_初学python的PIL模块

    这个星期事情比较多,所以学习的任务没有完成的很完美,不过也还是学了一点东西的.下面来介绍一下PIL模块. 对PIL的学习还是要从sae平台上没办法读写本地文件说起.因为我要一次性上传好多张图片,所以不 ...

  3. python连接linux堡垒机_利用Python Paramiko开发linux堡垒机

    1.Paramiko模块下的demo.py程序 前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连的,即一 ...

  4. python中的递归思想_〖Python〗-- 递归、面向对象初识及编程思想

    [递归.面向对象初识及编程思想] 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策 ...

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

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

  6. python秒表模块_利用python的kivy模块做一个秒表

    Kiy是一个开源的Python模块库,用于开发界面应用程序和其它采用自然用户界面的多点触控应用软件.它可以在Android,iOS,Linux,OS X和Windows执行,是一款有趣跨平台的模块库. ...

  7. python getattr调用自己模块_在Python中通过getattr获取对象引用的方法

    getattr函数 (1)使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用. >>> li = ["Larry", "Curly ...

  8. python对excel数据更改_利用python对excel中一列的时间数据更改格式代码示例

    本篇文章小编给大家分享一下利用python对excel中一列的时间数据更改格式代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 问题场景:需要将 ...

  9. python链接hbase模块_利用python访问Hbase(Thrift模块安装与测试)

    转:http://shineforever.blog.51cto.com/1429204/1567640/ hadoop环境介绍: master服务:node1 slave服务器:node2,node ...

最新文章

  1. 垂直AI初创企业 VS 横向AI初创企业:不同的产品路线选择
  2. 047_BOM_DOM
  3. STM32F0308开发环境的选择--CooCox CoIDE篇
  4. 苹果iOS 10.3.1修复博通Wi-Fi芯片重大安全漏洞
  5. hibernate注解实体类(Emp.java)
  6. Firefox下强制页面缓存失效的设置方法
  7. php 查询键名是否存在,PHP array_key_exists():检测键名是否位于数组中
  8. 15个SaaS问答(图文并茂版)
  9. MICCAI 2019 :纪录、风向与学术思考
  10. Java新手之Java 从代码到运行的过程
  11. 虚拟机中出现两个虚拟网卡
  12. NP、OSPF监测调试
  13. 华为方会提供一份CRS(客户需求)和SOW(工作任务书)
  14. 解读机器人编程入门指南
  15. PHP+Mysql 实现数据库增删改查
  16. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx
  17. 莫斯卡托葡萄酒的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. Spring -从走火到入魔
  19. Mybatis插入语句
  20. **修炼一名程序员的职业水准(林庆忠__署名原创)**

热门文章

  1. 爬取豆瓣音乐TOP250并写入Excel
  2. 计算机社团时间安排,计算机社团工作安排
  3. 马斯克借势ChatGPT强推1000美元认证服务,《纽约时报》拒付被开除大V
  4. 讲一讲移动端跨平台技术的演进之路
  5. 2020金华跨境电商高峰论坛顺利闭幕!跨境电商是当前国际贸易最好的形式!
  6. istio过滤sidecar的流量劫持
  7. 微服务设计原则之AKF原则
  8. 王菊与周星驰画风迥异跨次元合作
  9. 深度学习 - 35.TF x Keras FM、WideAndDeep、DeepFM、DeepFwFM、DeepFmFM 理论与实战
  10. 1、matlab串联机器人DH建模