提高代码可重用性, 减少重复劳动 -- 手把手带你 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供别人使用的完整流程。光说不练假把戏,光看不做只是眼睛学会了,手没学会,动手实践起来吧~把自己的模块分享出来让大家开发变得更加简单!

目录
相关文章
|
4天前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
40 15
|
5天前
|
缓存 监控 测试技术
Python中的装饰器:功能扩展与代码复用的利器###
本文深入探讨了Python中装饰器的概念、实现机制及其在实际开发中的应用价值。通过生动的实例和详尽的解释,文章展示了装饰器如何增强函数功能、提升代码可读性和维护性,并鼓励读者在项目中灵活运用这一强大的语言特性。 ###
|
8天前
|
缓存 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第35天】装饰器在Python中是一种强大的工具,它允许开发者在不修改原有函数代码的情况下增加额外的功能。本文旨在通过简明的语言和实际的编码示例,带领读者理解装饰器的概念、用法及其在实际编程场景中的应用,从而提升代码的可读性和复用性。
|
6天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
19 5
|
5天前
|
存储 JSON API
如何自定义Python环境变量?
如何自定义Python环境变量?
18 3
|
4天前
|
JSON API 数据格式
如何使用Python开发1688商品详情API接口?
本文介绍了如何使用Python开发1688商品详情API接口,获取商品的标题、价格、销量和评价等详细信息。主要内容包括注册1688开放平台账号、安装必要Python模块、了解API接口、生成签名、编写Python代码、解析返回数据以及错误处理和日志记录。通过这些步骤,开发者可以轻松地集成1688商品数据到自己的应用中。
19 1
|
5天前
|
Python
探索Python中的装饰器:简化代码,提升效率
【10月更文挑战第39天】在编程的世界中,我们总是在寻找使代码更简洁、更高效的方法。Python的装饰器提供了一种强大的工具,能够让我们做到这一点。本文将深入探讨装饰器的基本概念,展示如何通过它们来增强函数的功能,同时保持代码的整洁性。我们将从基础开始,逐步深入到装饰器的高级用法,让你了解如何利用这一特性来优化你的Python代码。准备好让你的代码变得更加优雅和强大了吗?让我们开始吧!
13 1
|
9天前
|
设计模式 缓存 监控
Python中的装饰器:代码的魔法增强剂
在Python编程中,装饰器是一种强大而灵活的工具,它允许程序员在不修改函数或方法源代码的情况下增加额外的功能。本文将探讨装饰器的定义、工作原理以及如何通过自定义和标准库中的装饰器来优化代码结构和提高开发效率。通过实例演示,我们将深入了解装饰器的应用,包括日志记录、性能测量、事务处理等常见场景。此外,我们还将讨论装饰器的高级用法,如带参数的装饰器和类装饰器,为读者提供全面的装饰器使用指南。
|
5天前
|
存储 缓存 监控
掌握Python装饰器:提升代码复用性与可读性的利器
在本文中,我们将深入探讨Python装饰器的概念、工作原理以及如何有效地应用它们来增强代码的可读性和复用性。不同于传统的函数调用,装饰器提供了一种优雅的方式来修改或扩展函数的行为,而无需直接修改原始函数代码。通过实际示例和应用场景分析,本文旨在帮助读者理解装饰器的实用性,并鼓励在日常编程实践中灵活运用这一强大特性。
|
9天前
|
存储 算法 搜索推荐
Python高手必备!揭秘图(Graph)的N种风骚表示法,让你的代码瞬间高大上
在Python中,图作为重要的数据结构,广泛应用于社交网络分析、路径查找等领域。本文介绍四种图的表示方法:邻接矩阵、邻接表、边列表和邻接集。每种方法都有其特点和适用场景,掌握它们能提升代码效率和可读性,让你在项目中脱颖而出。
23 5