Head First Python之2函数模块

时间:2024-12-27 14:33:38

模块就是一个包含Python代码的文本文件,以.py结尾。

第三方模块都在PyPI(python package index)上,可使用PyPI发布你的模块,供他人使用。

注释代码

# coding=utf-8

"""
nester.py模块
模块描述放在这里
""" def print_lol(li):
"""
描述函数放在这里
:param li: list
:return: None
"""
for each in li:
if isinstance(each, list):
print_lol(each)
else:
print(each)

发布到PyPI

1、为模块创建各一个文件夹nester_zlm

  文件夹下面包含nester.py和setup.py  

  setup.py包含发布的元数据,代码如下:

from distutils.core import setup

setup(
name='nester',
version='1.0.0',
py_modules=['nester'],
author='hfpython',
author_email='zlm_dj68@163.com',
url='http://www.findeen.co.uk/headfirstlabs.com.html',
description='a Simple printer of nested lists',
)

2、构建一个发布文件

nester_zlm文件夹中打开一个终端窗口,键入命令:python3 setup.py sdist

3、将发布安装到你的Python本地副本中

python3 setup.py install

安装成功后发布已经准备就绪

Head First Python之2函数模块

4、发布速览

build和dist的是发布工具生成的。

Head First Python之2函数模块

5、导入模块并使用

导入新创建的模块nester,定义一个列表,调用print_lol函数,没有加命名空间时,会导致NameError;

用命名空间限定函数名后,pass。

Head First Python之2函数模块

若使用 from nester import print_lol,则可以不用命名空间,但要注意,如果当现有空间存在print_lol,那么导入的函数会覆盖现有的函数。

6、注册Pypi网站

https://pypi.python.org/pypi?%3Aaction=register_form

Head First Python之2函数模块

PGP Key一般都不用填

7、向pypi上传代码

(1)通过命令行窗口注册Pypi

pyton3 setup.py register

(2)通过命令行窗口上传

python3 setup.py sdist upload

(当然,如果试图上传一个名字为nester的模块,会得到一个错误,指出这个模块名字已经被占用)

添加参数

新的需求

现在有新的需求,nester.py模块的print_lol函数,当碰到一个嵌套列表时,需要有缩进,以让层次跟清晰。

这时需要添加额外的参数控制行为

# coding=utf-8

def print_lol(the_list, level):
"""
所提供列表中的各个数据项会(递归地)打印到屏幕上,而且各占用一行
:param the_list: 包含或者不包含嵌套列表的列表
:param level:用来在遇到嵌套列表时插入制表符
:return: None
"""
for each in the_list:
if isinstance(each, list):
print_lol(each, level+1)
else:
for tab_stop in range(level):
print("\t", end="")
print(each) if __name__ == '__main__':
li = [1, [2, 3], 4]
print_lol(li, 0)

运行结果:

Head First Python之2函数模块

将上述代码更新到pypi

1、修改setup.py中version='1.1.0',

2、发布 python3 setup.py sdist upload

可选参数

上述nester.py模块有个问题,无法兼容老版本,此时我们可以用可选参数

为了实现可选参数,需要位这个参数提供一个缺省值,如下:

def print_lol(the_list, level=0):

这样,我们使用以下两种都是一样的了:

print_lol(li)
print_lol(li, 0)

API还是不对

上述nester.py模块还有个问题,并不是所有人都想有缩进,那如何兼容不带缩进呢

再添加一个新的变量

# coding=utf-8

def print_lol(the_list, indent=False, level=0):
"""
所提供列表中的各个数据项会(递归地)打印到屏幕上,而且各占用一行
:param indent: False-不打开缩进,True-打开缩进
:param the_list: 包含或者不包含嵌套列表的列表
:param level:用来在遇到嵌套列表时插入制表符
:return: None
"""
for each in the_list:
if isinstance(each, list):
print_lol(each, indent, level+1)
else:
if indent:
for tab_stop in range(level):
print("\t", end="")
print(each) if __name__ == '__main__':
li = [1, [2, 3], 4]
print_lol(li, True)