文件夹|封装Python代码包的六个步骤!现在就记住

全文共7134字 , 预计学习时长14分钟
文件夹|封装Python代码包的六个步骤!现在就记住文章插图
假设你很喜欢用同一段Python代码 , 里面有几个相关的小型函数 , 或者是含有几百行代码的中型模块 。 程序员可能会把它复制到不同的项目或存储库中 , 或者从特别设置的实用工具代码文件夹中导入这段代码 。
这很正常 。 程序员在编写代码的过程中都会不断积累这些个性化的小工具 。 相比其他编程语言来说 , Python更容易积累这些语句——这些代码非常实用 。
如果无需复制 , 就可以轻松导入自己开发的小工具 , 并进行更新和维护 , 岂不是更好吗?如果不依赖于特定的文件或路径 , 让这些代码在不同的环境、机器和语境中都适用?如果可以将这些个性化工具版本化 , 并使相关代码清楚地反映出其依赖性呢?如果这个工具能为大众所用呢?
没错 , 它都可以做到 。
当然 , 这个概念不是第一次提了 。 这就是通常在编程语言中使用模块、包和库的原因 , 特别是在Python的开发环境中 。 它的实现可使Python功能更加强大;只需简单的pip install 和 import就能获得BeautifulSoup的html解析功能或pandas的数据帧处理功能 。
另外 , 人人都可以将自己的代码在PyPI上编写和发布(PyPI是Python包的官方索引:) , 使它们与sklearn、requests或delorean(都是非常实用、流行的Python包)一样简单易得 。 以下是它的几点优势:
· 即使只有很少人使用 , 共享自己的代码仍是一件很有趣的事;程序员可以在工作、社群活动或求职面试中分享并展示自己的劳动成果 。
· 通过强制性地整理和记录代码 , 公开给同行进行评价 , 从而改进代码 。
· 它还能弥补社群的不足 。 你会惊讶地发现 , 很多人会注意到你的序列化十分高效 , 比如将HTTP报头序列化到JSON 。 或者发现自己创建的用来验证输入MongoDB查询文档修饰符的工具有多么实用 。
心动了吗?忘记那个旧的Python模块 , 开始制作小型Python包吧 。
文件夹|封装Python代码包的六个步骤!现在就记住文章插图
图1: Python dust
步骤一:命名
首先是命名 。 好的名字通常比较简短 , 便于在pip install 或 import 完成之后输入(尽管现在已经出现了“自动输入”);还要包含足够的信息便于理解 , 或者在安装完成后之后提示其中的内容 。
requests负责处理HTTP请求、delorean负责日期和时间 , sklearn负责提供机器学习框架 , 这些都是很好的例子 。 在为pandas管道包(由于pandas 通常以pd这样较短别名导入 , 故使用pdpipe:)和缓存包(cachier:)命名时 , 笔者也尝试过这些例子 。
不过老实说 , 这些并不是固守的规则 。 流行的Python包都有pandas、 keras、 django、 boto、 jinja、 flask 和 pytorch等名称 , 大家能记住这些名字 , 所以读者也可以使用任何简短且可读的名称(例如 , 由于可读性问题 , 笔者将“Scikit-Learn Wrappers for FastText”缩写成了skift) 。 本文以chocobo为例 。
步骤二:确定代码包的基本结构
接下来 , 通过几个简短的步骤 , 制作一种通用的结构:
1.用代码包的准确名称创建一个Github存储库 , 不要使用驼峰式或过多的个人发挥 。 然后在本地进行复制 。
2.在该存储库中新建一个文件夹 , 用代码包的准确名称命名;这就是保存代码包的文件夹 。 这是一种规范 , 只需记住外部的chocobo 文件夹(在本例中)就是存储库的文件夹 , 而内部的chocobo 文件夹是包的文件夹 。
3.将自己的模块和涉及到的任何其他模块放在内部的chocobo文件夹中 。 如果存在缺失的部分 , 请添加__init__.py 文件 。
4.将用户直接调用的重要对象(通常是函数)从各自的模块中导入至__init__.py文件 。 有了代码包的命名空间 , 就可以使用这些函数、分类和变量了 。 如果愿意 , 也可以使用代码包的API 。
5.虽然不是强制规定 , 笔者强烈建议在代码包或在存储库的根目录中都应包含一个 .gitignore 文件 。
示例:
现在有了一个结构 , 可以添加不同类型的文件组成代码包;内部文件夹保存的是包的代码 , 外部文件夹保存的是辅助包文件和其他与存储库相关的文件 。
因此 , 初始模块chocobo.py如下所示:
"""My chocobo cooking script."""import osdef chocobo_roast(num_guests, hotness_level): # amazing python code here新建存储库文件夹如下所示:
chocobo/ chocobo/ __init__.py chocobo.py .gitignore__init__.py 文件应如下所示:
"""chocobo is a python package for delicious Chocobo recipes."""from .chocobo import ( chocobo_roast,)