

英语原文共 494 页,剩余内容已隐藏,支付完成后下载完整资料
共享你的代码
函数模块
可重用的代码固然不错,不过可共享的模块更棒。
通过作为Python模块共享代码,就可以向整个Python社区开放你的代码......共享总是一件好事,不是吗?在这一章中,你将学习如何创建、安装和发布你自己的共享模块,然后把你的模块加载到Web上的Python软件共享网站,这样所有人都能受益于你的工作。在学习过程中,你还会了解一些与Python函数有关的新技巧。
没错,这么好的函数应该与全世界共享。
Python提供了一组技术,可以很容易地实现共享,这包括模块和一些发布工具:
- 模块允许你合理组织代码来实现最优共享
- 发布工具允许你向全世界共享你的模块
下面把函数变为一个模块,然后使用发布工具让广大的Python编程社区共享这个模块。
函数转换为模块
模块就是一个包含Python代码的文本文件。对模块的主要需求就是要求文件名以.py结尾,这是Python扩展名。要把你的函数转换为一个模块,需要把代码保存到一个适当命名的文件中。
最好的Python编辑器是什么?
这个问题的答案取决于你问的是谁。不过,当然可以使用任何文本编辑器来创建函数代码,兵保存到一个文本文件中。想Windows的Notepad这样简单的编辑器就能胜任这个工作,而对于Mac OS X的TestMate之类功能完备的编辑器来说更是不在话下。还有一些相当成熟的IDE,如Linux的Eclipse,以及经典的vi和emacs编辑器都可以使用。另外,你应该已经知道,Python提供了IDLE,它也包括一个内置的代码编辑器。这个编辑器可能不如那些“真正的”编辑器功能强大,不过IDLE是Python内置安装的,所以肯定可以使用。对于很多工作来说,处理Python代码时只需要IDLE的编辑窗口就完全足够了。当然Python有很多其他编辑器。可以查看WingIDE找到一个专门面向Python开发人员的编辑器。
模块无处不在、
想想,很多地方都可以找到Python模块。
Python包索引(Python Package Index,PyPI)为Internet上的第三方Python模块提供了一个集中的储存库。准备好了之后就可以使用PyPI来发布你的模块,从而使你的代码可提供其他人使用。你的模块已经准备就绪,不过还有一个重要的补充。
注释代码
使用代码添加注释是个好主意。计划向全世界分享您的模块是,如果有完善的注释,这对于简历文档很有帮助。
在Python中,常见的注释技术是使用三重引号多行注释。 当您使用三重报价而不将其分配给变量,三重引号之间的一切都被认为是一个注释
现在您已经添加了注释并创建了一个模块,让我们测试一下您的代码是否仍然正常工作。
不要将函数的代码输入IDLE的提示符,而是将nester.py文件放入IDLE的编辑窗口,
然后按F5运行模块的代码
准备发布
为了共享您新创建的模块,您需要准备一个分布。在Python中,所谓“发布”是指一个文件的集合,这些文件联合在一起允许你构建、打包盒发布你的模块。
一旦分发存在,您可以将模块安装到本地副本的Python,以及将您的模块上传到PyPI与世界分享。按照这两个页面上的流程,为你的模块创建一个发布。
构建发布
现在已经有了一个文件夹,其中包含两个文件:模块代码放在nester.py中模块的有关元数据放在setup.py中。现在来构建你的发布
发布速览
由于Python的分布实用程序,您的模块已经转换为一个分发并安装到你的Python的本地副本。
你从一个单一的函数开始,它被输入到一个名为nester.py的文件中,创建一个模块。 然后,您创建了一个名为nester的文件夹以容纳您的模块。 添加一个名为setup.py的文件到您文件夹允许您构建和安装您的分发,这会导致在一些额外的文件和两个新的文件夹中出现
您的nester文件夹。 这些文件和文件夹都是由发布工具为你创建的。
导入模块并使用
既然已经构建了模块,并作为发布打包和安装,下面来看使用时还需要什么。要使用一个模块,只需要把它导入到你的程序中,或者导入到IDLEshel
import语句告诉Python将包nester.py模块包含在你的程序中。从那时起,你可以使用这个模块的函数,就好像他们直接输入你的程序一样,对吧? 嗯...这就是你可能期望的。让我们来看看你的假设的有效性。
Python的模块实现命名空间
Python中的所有代码都与一个命名空间相关联。
在主Python程序(和IDLE的shell)中的代码是名为__main__的命名空间关联。 当你把你的代码放在其独立的模块中时,Python自动创建一个无模块名称相同的命名空间,你的模块中的代码与一个命名空间相关联,称为nester。
当您使用plain import语句(如import nester)时,Python解释器被指示允许您访问nester的函数使用命名空间限定。然而,它是可能的更具体。如果你使用从nester import print_lol,会把指定的函数(在这种情况下为print_lol)被添加到当前命名空间,有效地消除了您使用的求命名空间限定。 但你需要小心。 如果你已经有在当前命名空间中定义的一个名为print_lol的函数特定导入语句将使用导入覆盖您的函数一个,这可能不是你想要行为。
注册PyPl网站
为了向PyPl上传你的发布,需要在PyPl站注册。这个过程非常简单。首先访问PyPl网站,并请求一个PyPl ID
如果所有注册信息都没有问题,会向你在注册表单上提交的email地址发出一个确认消息。这个email消息包含一个链接,可以点击这个链接来确认你的PyPl注册
向PyPl上传代码
你准备好了! 您的函数中的代码已放置在模块中,用于创建分发并安装到Python的本地副本。 至上传您的发布到PyPI,完成这两个步骤:命令行注册与PyPI和命令行上传。
可能看起来很奇怪,必须再次注册PyPI,但我们刚在PyPI上注册过。但是,命令行上传工具需要知道你的PyPI用户名和密码,这就是注册需要用的。不要担心:你只能这样做一次。
炫影来到PyPI社区
恭喜!你现在是一个成熟的,PyPI社区的成员。 您的发布商已加入超过10,000个其他上传on PyPI。随意浏览到PyPI网站以确认上传。
来自世界各地的程序员现在可以下载,解压缩和安装你的模块到他们的本地副本的Python这是很酷的时候你想想。
成功的代价是责任
有很多来自不同地方的程序员在使用你的模块其中有些程序员还需要更多特性。
不可避免需要做出改变
你要让当前的用户满意,维护现有的功能,同时还要为有需求的那些用户提供改进的功能,这可能会很棘手。
生活中处处有选择
要确定这里该怎么做,可能有很多建议。
用额外的参数控制行为
如果向函数增加一个额外的参数,不用太麻烦就可以用现在的代码处理缩进。
写新代码之前,先考虑BIF
当你遇到一个你认为是通用的需求,问自己是否有一个内置函数(BIF)可以帮助。 毕竟,迭代固定数量的时间是你需要做的所有的时间。
另外要记住:Python 3包括70多个BIF,所以有很多功能等待你来发现。
range()BIF迭代固定次数
range()BIF可以提供你需要的控制来迭代指数的次数,而且可以用来生成一个从0直到(但不包含)某个数的数字列表,以下是这个BIF的用法
既然对range()BIF已经有所认识,下面修改你的函数来使用让range(),让嵌套列表缩进制定数目的制表符。
Python会尽力运行你的代码
与编译的语言(如C,Java,C#和其他)不同,Python不完全检查代码的有效性,直到它运行。这允许Python做一些相当酷的东西,只是不可能在那些其他语言,如作为在运行时动态定义函数。这当然可以非常灵活强大。
但是,你的成本是,你需要在写作时非常小心您的代码,因为通常会被捕获和标记为一个传统的,静态类型的编译语言的“错误”经常出现在Python中未被注意。
跟踪代码
当你试图找出一个程序出现了什么问题可以使用一个很有用的技术,这就是跟踪各行代码执行时到底发生了什么。 这里是你目前使用的代码。只有三行长(记住:列表的创建是一行代码),它看起来应该不会导致任何麻烦
数据赋至函数的参数后,开始在所传入的列表中包含的各个数据项上执行这个函数的代码
找出哪里出了问题
你的问题在于:递归调用你的函数是使用旧函数签名只需要一个参数。函数的新版本需要两个参数。
用你的代码更新PyPI
继续编辑您的nester.py模块(在nester文件夹中)正确调用您的函数。 现在你有一个新版本的模块,更新您上传到PyPI的发布是一个好主意。随着您的代码修改,还需要一个小的变化发布的setup.py程序。您已更改API,因此请进行调整与setup.py中的版本相关联的值。
就像创建和上传发布时所做的一样,在发布文件夹中调用setup.py程序来完成上传
你改变了API
你的新版本nester确实更好一些,但是并不是所有的用户都这么认为。
在你急于发布模板的最新版本和最新版本,你忘记了一些现有的用户。 回想一下,并非所有用户都想要新的嵌套打印功能。 但是,通过添加第二个参数到print_lol(),你改变了函数的签名,这意味着您的模块有不同的API。 任何使用旧的API的人都会有
问题。
理想的解决方案是提供两个API,一个打开新功能和另一个没有。 也许这个功能可以是可选的?
使用可选参数
要将函数的必需参数转换为可选参数,请提供该参数具有默认值。 当没有提供参数值时,
使用默认值。 当提供参数值时,将使用它的默认值。 关键点是,默认值为参数有效地使参数可选。
要为任何函数参数提供默认值,请指定默认值
值后的参数名称:
定义了参数的缺省值之后,现在可以采用多种不同方式调用这个函数的函数现在支持不同的签名,不过功能还照旧修改你的代码,使level参数的默认值为0,然后将你的代码加载到IDLE编辑器中。按F5将代码加载到shell中,然后按照确认最新版本的功能按预期工作。 开始定义一个简短的列表列表,并使用该功能在屏幕上显示列表
模块支持两个API
漂亮!看起来你的模块很不错,因为两个API(原来的1.0.0API和新的1.1.0API)现在都能使用。
API还是不对
尽管这个API允许用户按原来的形式调用函数,但是默认情况下会打开嵌套打印,并不是所有人都需要这种行为,而且有些人根本不希望这样。
当然,如果确实希望某个功能是可选的(也就是说,不是默认的),就应该调整代码来保证这一点。不过怎么做到呢?
一种解决方案是增加第三个参数,需要缩进时就设置为True,不需要缩进是就设置为False。如果确保这个参数默认为False,原来的功能就会成为默认行为,代码的用户必须显示请求这个新的缩进特性。
模块重获声誉
恭喜你!改进后的新模块很快赢得了很好的口碑。
你的Python技艺已初见雏形
你已经创建了一个有用的模块,使它能够共享,而且上传到PyPI网站。全世界的程序员都可以下载这个模块,并在他们的项目中使用你的代码。
1模块是包含Python的文本文件
码。
2分布实用程序让你转动你的模块转换为可共享包。
3 setup.py程序提供您的模块的元数据和使用以构建,安装和上传您的包装分配。
4将模块导入其他程序使用import语句。
5 Python中的每个模块都提供了自己的命名空间和命名空间名称用于限定模块的功能当使用模块调用它们。function()形式。
6具体来说,从模块导入函数到当前命名空间使用from模块导入函数形式import语句。
7使用#注释掉一行代码或添加一个简短的单行注释程序。
8内置函数(BIF)有自己的名为__builtins__的命名空间,这是自动包括在每一个Python程序。
9 range()BIF可以与for一起使用迭代固定次数。
10包括end =#39;#39;作为参数print()BIF关闭自动在输出上包括新线。
11您的函数的参数是可选的如果您为它们提供一个默认值。
文件与异常
只是在代码中处理列表数据还不够
您需要能够轻松地将您的数据导入您的程序。 这不奇怪那么Python使得从文件中读取数据变得容易。 这是伟大的,直到你考虑当与您的程序外部的数据交互时,什么可能出错是很多事情等待你去旅行! 当坏事发生时,你需要一个策略摆脱麻烦,一个这样的策略是处理任何异常情况使用Python的异常处理机制在本章中展示。
程序外部的数据
大多数程序都遵循输入,处理,输出模型,首先输入数据,进行处理,然后存储。显示、打印或传输。
到目前为止,你已经了解如何处理数据,也知道如何在屏幕上显示数据。不过你知道如何向程序传入数据吗?具体来讲,怎么样从文件读取数据?
都是文本行
Python中的基本输入机制是基于行的
全文共6951字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[145621],资料为PDF文档或Word文档,PDF文档可免费转换为Word
