提高代码可重用性, 减少重复劳动 -- 手把手带你 Python 自定义模块并上传到 pypi, 贡献自己创造的轮子为所有人使用, 让 Python 开发更简单

简介: 我们都知道程序中可通过定义函数来减少工作量,提高代码的可重用性,从而提高我们的开发效率.我们一直import的是别人的模块,那如果我们需要使用自己的模块,或者开发一个自己的模块供别人使用,我们自己造轮子该怎么做呢?我们实际的开发中,只在一个文件中编写代码是不太可能的,当开发大型项目的时候,一个文件过于臃肿,第一个是不利于阅读,代码可读性极差,还不利于团队协作开,所以这时候我们需要引入模块的概念.下面我们来了解什么是模块

前言

我们都知道程序中可通过定义函数来减少工作量,提高代码的可重用性,从而提高我们的开发效率.我们一直import的是别人的模块,那如果我们需要使用自己的模块,或者开发一个自己的模块供别人使用,我们自己造轮子该怎么做呢?

我们实际的开发中,只在一个文件中编写代码是不太可能的,当开发大型项目的时候,一个文件过于臃肿,第一个是不利于阅读,代码可读性极差,还不利于团队协作开,所以这时候我们需要引入模块的概念.下面我们来了解什么是模块

什么是模块

我们对模块并不陌生,可能你已经使用多次,我们在使用import的时候就是使用到模块,比如我们在使用数组的时候会import numpy,我们在操作Excel数据时会import pandas.其实我们之前所有自己编写的代码片段都可以修改为一个模块,避免重复的劳动,提高开发的灵活性,接下来我们看下numpy包含的内容

我们可以使用一下代码输出numpy模块中定义的全部内容的名称.

importnumpyprint(dir(numpy))

运行结果部分截图:从截图中可以看出里面包含了很多我们常用的函数

网络异常,图片无法展示
|

下图的代码就是我们经常使用的numpy模块中的Arrayterator大数组的缓冲迭代器的源码:

网络异常,图片无法展示
|

接着我们详细分析import numpy是如何在程序中起作用的,当程序运行到import numpy的时候,便会开始寻找numpy模块,这一句就是告诉Python我们在程序中要使用该模块的内容.我们在使用之前已经使用pip install numpy安装过,已经把numpy安装到本地对应版本的Python中,在代码中我们无需指明模块目录,Python知道他的具体位置.

除了import,还有一条我们常用的引用的语句:from...import,他是将模块部分内容引到我们的程序中.比如下面这段代码:

frommathimportsqrtprint("根号100:", sqrt(100))

程序将根号函数sqrt从math模块中引入程序并使用他,这种引入方式不必使用模块名加点符(比如:copy.deepcopy(data))。可以直接使用函数名,但是这也带来了名称冲突问题.这样只会引入模块的部分内容,减少了计算机的工作量,但是,一般来说我们在程序中应该尽量避免使用from...import语句,因为这条语句可能会导致程序中出现名称冲突并且让我们的程序更难被别人理解。

自定义模块

通过上述的讲解,大家对模块可能还是感觉有点神秘,如果你之前已经写过的案例或是练习的程序,那么在无形中你已经定义了很多模块。每一个独立的Python程序都可以当成一个模块。接下来我们使用代码段的方式正式创建一个模块并调用他。

也许大家学习其他编程语言的时候或者在数学中了解过斐波那契数列,甚至还使用其他语言实现过,这次咱们也使用Fibonacci数列练练手。以此为例创建一个自定义模块.文件名:myfirstmodule.py

deffibo(n):
ifn<=1:
returnnelse:
return (fibo(n-1)+fibo(n-2))
defprintFibo(n):
foriinrange(n):
print(fibo(n))
__version__='0.1'

代码中创建了两个函数,一个是实现斐波那契数列,另外一个printFibo(n)函数是控制输出数列个数的循环代码装入,最后添加了一行表示模块当前的版本号的变量,让该文件的内容更像一个模块。

接下来在模块文件myfirstmodule.py同目录下创建调用模块文件callModule.py,其内容如下:

importmyfirstmoduleprint('使用的模块版本:', myfirstmodule.__version__)
myfirstmodule.printFibo(20)

运行结果如下:

网络异常,图片无法展示
|

调用的程序中,我们使用模块名加点调用模块中的变量和函数。那么我们Python是如何找到我们定义的模块呢?在创建callModule.py文件时我们提到过要在同目录下创建,这是因为当导入模块时Python会按照:"当前目录"->PYTHONPATH(就是安装Python的默认路径)下的每一个目录->默认路径(系统中的默认路径)这个顺序搜索模块直到找到该模块.

上传到pypi

准备

注册PyPI用户

网络异常,图片无法展示
|

Pypi是什么

pypi是一个python包的仓库,里面有很多别人写好的python库,你可以通过easy_install或者pip进行安装,方便用户更方面的使用你的代码模块。所以我们平时使用pip install 这个命令安装的模块都是从这里拉取的

注册完pypi需要验证邮箱!

网络异常,图片无法展示
|

代码上传到pypi的流程

将代码打包并上传到pypi上,大体上分为以下几步:

1、整理代码的目录结构,方便打包和python的import,为了方便引用,需要将代码模块变成一个包,所以需要将功能代码用目录来整合方便引用,并且需要创建__init__文件,__init__中可以没有内容,也可以在__init__文件中进行import(from .extractor import Document)操作,以减少整体模块引用时import的层数,避免错误。里面的myfirstmodule.py还是上面的写好的代码


网络异常,图片无法展示
|

2、功能模块的目录整理好后,就可以开始整理和添加发布到pypi上所使用的文件了

就是将原来的目录深移一层,文件夹名称可以根据自己意愿。然后在到第一层的目录下创建些特殊文件,具体你可以看看下面红色框里面的文件结构就大概明白了:


网络异常,图片无法展示
|

LICENSE文件是授权文件,比如: MIT license, APACHE license


Copyright (c) 2018 The Python Packaging Authority
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

README 文件使用过github的童鞋都不陌生,其实就是项目介绍和使用说明

setup.py文件才是重点,是python模块安装所需要的文件,它的格式如下图:


网络异常,图片无法展示
|

3、进行打包代码并上传到pypi


为了保证效果,在打包之前我们可以验证setup.py的正确性,打开命令行工具,然后定位到你的项目目录,比如我的是mymd;接着执行下面的代码

  python setup.py check

网络异常,图片无法展示
|

3.1、写好的代码先上传到GitHub:


网络异常,图片无法展示
|

3.2、生成whl文件并上传给PYPI


进入你python环境,打开终端,进入到 mymd 文件夹下。我python环境是conda 环境,默认名称base


conda activate base
pip install setuptools  -i https://mirrors.aliyun.com/pypi/simple/
pip install wheel -i https://mirrors.aliyun.com/pypi/simple/

3.3使用python setup.py sdist bdist_wheel命令进行打包,执行完成后会在 mymd 文件夹生成build、dist、xiaomicaiFibo_pip_fibo.egg-info三个文件夹


网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|

4、上传到pypi


使用twine上传代码,如果没有安装过twine需要先使用一下代码安装,安装命令如下:

pip install twine -i https://mirrors.aliyun.com/pypi/simple/

上传:twine upload --repository-url https://upload.pypi.org/legacy/ dist/*

执行这条命令输入用户名和密码,用户名密码是你注册PIPY时的用户名密码

上传成功如下图:

网络异常,图片无法展示
|

这时候进入pypi后台就可以看到自己上传的项目:

网络异常,图片无法展示
|



安装并测试我们上传的模块


安装我们自己的模块:

pip install xiaomicaiFibo-pip-fibo

网络异常,图片无法展示
|
网络异常,图片无法展示
|

测试代码运行:

fromxiaomicaiFiboimportmyfirstmoduleprint('使用的模块版本:', myfirstmodule.__version__)
myfirstmodule.printFibo(20)

运行结果:

网络异常,图片无法展示
|


至此,我们已经已经完成了一次自定义模块以及把自己定义的模块上传到Pypi供别人使用的完整流程。光说不练假把戏,光看不做只是眼睛学会了,手没学会,动手实践起来吧~把自己的模块分享出来让大家开发变得更加简单!

目录
相关文章
|
1月前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
56 7
|
4天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
23 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
4天前
|
人工智能 测试技术 数据处理
通义灵码 2.0 体验报告:Deepseek 加持下的 Python 开发之旅
通义灵码 2.0 体验报告:Deepseek 加持下的 Python 开发之旅
57 11
|
1月前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
111 34
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
23天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
Python
Python Internet 模块
Python Internet 模块。
133 74
|
8天前
|
API Python
python泛微e9接口开发
通过POST请求向指定IP的API注册设备以获取`secrit`和`spk`。请求需包含`appid`、`loginid`、`pwd`等头信息。响应中包含状态码、消息及`secrit`(注意拼写)、`secret`和`spk`字段。示例代码使用`curl`命令发送请求,成功后返回相关信息。
30 5
|
26天前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
32 10
|
2月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
78 33
|
2月前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
333 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南

热门文章

最新文章

推荐镜像

更多