Python从小白到高手实现系列三:标准库中的变化

语法变化很容易发现,标准库中的重大变化也是非常容易发现的。Python 的每个后续
版本都会向标准库模块中添加、弃用、改进或完全删除某些内容。在旧版 Python(1.x 和
2.x)中也会定期有这样的变化,所以出现在 Python 3 中并不让人吃惊。大多数情况下,对
于删除或重组的模块(例如 urlparse 移到了 urllib.parse),在运行解释器时会对导
入语句抛出异常。这样的问题很容易发现。无论如何,为了确保能够发现所有类似的问题,
完整的代码测试覆盖率是必不可少的。在某些情况下(例如使用延迟加载模块时),这个通
常在全局导入时出现的问题并不会出现,直到在代码中将某些模块作为函数调用时才会出
现。因此,在测试期间确保每行代码都要实际运行是很重要的。
延迟加载模块
延迟加载模块是指在全局导入时并不加载的模块。在
Python 中,import 语句可以包含在函数内部,这样导
入是在函数调用时才会发生,而不是在全局导入时发
生。在某些情况下,模块的这种加载方式可能比较合理,
但大多数情况下,这只是对设计不佳的模块结构的变通
方法(例如避免循环导入),通常应避免这种加载方式。
当然,对于标准库模块来说,没有理由使用延迟加载。
3.数据类型与集合的变化
开发人员在努力保持兼容性或只是将现有代码迁移到 Python 3 上时,需要特别注意
Python 中数据类型与集合的表示方式的变化。虽然不兼容的语法变化或标准库变化很容易
发现,也很容易修复,但集合与数据类型的变化要么难以察觉,要么需要大量的重复工作。
这样的变化列表会很长,再次重申,官方文档是最好的参考资料。
不过,这一节必须讲一下 Python 3 中字符串处理方式的变化,因为这是 Python 3 中最
具争议也是讨论最多的变化,尽管这是一件好事,使很多问题变得更加明确。
现在所有字符串都是 Unicode,字节(bytes)需要加一个 b 或 B 的前缀。Python 3.0
和 3.1 不支持使用 u 前缀(例如 u"foo"),使用的话会引发语法错误。不支持这个前缀是
引发所有争议的主要原因。这导致难以编写能够兼容 Python 不同分支的代码,2.x 版需要
用这个前缀来创建 Unicode。Python 3.3 又恢复了这个前缀,虽然没有任何语法上的意义,
只是为了简化兼容过程。
用于保持跨版本兼容性的常用工具和技术
在 Python 不同版本之间保持兼容性是一项挑战。根据项目的大小不同,这项挑战可能
会增加许多额外的工作量,但绝对可行,也很值得去做。对于在许多环境中都会用到的
Python 包来说,必须要保持跨版本兼容性。如果开源包没有定义明确并经过测试的兼容范
围(compatibility bound),是不太可能流行起来的。而且,对于只在公司网络封闭使用的第
三方代码来说,也可以大大受益于在不同环境中的测试。
这里应该注意,虽然这一部分内容主要关注 Python 不同版本之间的兼容,但这些方法
也适用于保持与外部依赖项之间的兼容,外部依赖项包括不同的包版本、二进制库、系统
或外部服务等。
整个过程主要分为 3 个部分,按重要性排序如下。
• 定义并记录目标兼容范围的及其管理方法。
• 在每个环境中进行测试,并对每个兼容的依赖版本进行测试。
• 实现实际的兼容代码。
告知兼容范围是整个过程中最重要的一部分,因为这可以让代码使用者(开发人员)
对代码的工作原理和未来的变化方式有一定的预期和假设。我们的代码可能用于多个不同
项目的依赖,这些项目也在努力管理兼容性,所以把代码兼容性说清楚还是很重要的。
本书总是尽量给出几个选择,而不会强烈推荐某个特定选项,而这里是少数几个例外之一。
目前来看,管理兼容性未来变化的最佳方法,就是正确使用语义化版本(Semantic Versioning
semver)的版本号。它是一个广为接受的标准,用仅包含 3 个数字的版本标识符来标记代码的
变化范围。它还给出了如何处理弃用的方法建议。下面是摘录 semver 官网的摘要。
版本格式:主版本号.次版本号.修订号,版本号递增规则如下。
• 主版本号(MAJOR):当你做了不兼容的 API 修改。
• 次版本号(MINOR):当你做了向后兼容的功能性新增。
• 修订号(PATCH):当你做了向后兼容的问题修正。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
测试时就会发现一个悲伤的事实,为了保证代码与每个依赖版本和每个环境(这里环
境指的是 Python 版本)都保持兼容,必须在所有可能的组合中对代码进行测试。当然,如
果项目的依赖很多,做到这一点基本是不可能的,因为随着依赖版本数目的增加,组合的
数目也会迅速增加。因此,通常需要做一些权衡,使得运行所有兼容性测试无需花费数年
的时间。第 10 章中介绍一般的测试,里面也介绍了所谓的矩阵测试中工具的选择。
项目遵循 semver 的好处在于,通常只有主版本才需要
测试,因为次版本和修订版本中保证没有向后不兼容的
变化。只有项目不违背这样的约定,这种说法才能成立。
不幸的是,每个人都会犯错,许多项目中都出现了后向
不兼容的变化,甚至在修订版本中也出现了这种变化。
尽管如此,由于 semver 声称对次版本和修订版本的变
化保持严格的向后兼容,那么打破这个规则就可以视为
bug,可以在修订版本中进行修复。
如果明确定义了兼容范围并严格测试,那么实现兼容层就是最后一步,也是最不重要
的一步。但是,每一位对这个话题感兴趣的程序员都应该知道下列工具和技术。
最基本的就是 Python 的__future__模块。它将 Python 新版本中的一些功能反向迁移
到旧版本中,采用的是导入语句的形式:
from future import
future 语句提供的功能是和语法相关的元素,其他方法很难处理这些元素。这个语句只
能影响它所在的模块。下面是 Python 2.7 交互式会话的实例,从 Python 3.0 中引入 Unicode:
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit
(Intel)] on win32
Type “help”, “copyright”, “credits” or “license” for more
information.

type(“foo”) # 旧的字面值
<type ‘str’>
from future import unicode_literals
type(“foo”) # 现在变成了 unicode
<type ‘unicode’>
下面列出了所有可用的__future__语句,关注 2/3 兼容性的开发者都应该知道。
• division:Python 3 新增的除法运算符(PEP 238)。
• absolute_import:将所有不以点字符开头的 import 语句格式解释为绝对导入
(PEP 328)。
• print_function:将 print 语句变为函数调用,所以在 print 后面必须加括
号(PEP 3112)。
• unicode_literals:将每个字符串解释为 Unicode(PEP 3112)。
__future__中的可选语句列表很短,只包含几个语法功能。对于其他变化的内容,例如元
类语法(第 3 章会讲到这一高级特性),维持其兼容性则困难得多。future 语句也无法完全解
决多个标准库重组的问题。幸运的是,有些工具旨在提供一致可用的兼容层。最有名的就是 Six
模块,提供了常用的 2/3 兼容性的整个样板。另一个很有前途但名气稍逊的工具是 future 模块。
在某些情况下,开发人员可能不想在一些小型 Python 包里添加其他依赖项。通常的
做法是将所有兼容性代码放在一个附加模块中,该模块通常命名为 compat.py。下面是
来自 python-gmaps 项目的 compat 模块实例:

-- coding: utf-8 --

import sys
if sys.version_info < (3, 0, 0):
import urlparse # noqa
def is_string(s):
return isinstance(s, basestring)
else:
from urllib import parse as urlparse # noqa
def is_string(s):
return isinstance(s, str)
这样的 compat.py 模块十分常见,即使是利用 Six 保持 2/3 兼容性的项目也很常见,
因为这种方法非常方便,用于保存在不同版本的依赖包之间保持兼容性的代码。
下载示例代码
你可以用自己的账号在Packt的官方网站下载本书的示
例代码文件。如果你是在其他地方购买的本书,你可以
访问 Packt 的官方网站并注册,文件会直接通过邮件发
送给你。
下载代码文件的步骤如下。
• 用你的电子邮件地址和密码登录或注册我们的网站。
• 将鼠标指针悬停在顶部的 SUPPORT 选项卡上。
• 单击 Code Downloads & Errata。
• 在 Search 框中输入本书的名字。
• 选择你要下载代码文件的书籍。
• 从下拉菜单中选择本书的购买途径。
• 单击 Code Download。
文件下载完成后,请确保用下列软件的最新版本对文件
夹进行解压或提取。
• 在 Windows 上用 WinRAR 或 7-Zip。
• 在 Mac 上用 Zipeg、iZip 或 UnRarX。
• 在 Linux 上用 7-Zip 或 PeaZip。
本书的代码包也托管在 GitHub,网址为 https://github.com/
PacktPublishing/Expert-Python-Programming_SecondEdition。在 GitHub 上还有大量图书和视频资源。去看
一下吧!

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

断水流大撕兄

你的鼓励,就是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值