Python 2.3 新特性
Python 2.3 新特性
以下是 Python 2.3 新特性中(主观)的亮点。
更快
根据几个简单的基准测试,Python 2.3 比 Python 2.2.3 快约 20-30%。部分加速是通过移除 SET_LINENO 操作码实现的,这意味着在比较“python -O”时,差异不那么显著;其余部分是各种细致的优化。
新工具
现在包含一个全新的 IDLE 版本(来自 SourceForge 上的 IDLEfork 项目),作为 Lib/idlelib。旧的 Tools/idle 不再存在。
新增或升级的内置函数
- sum()- 一个用于对数字序列求和的新函数。“sum(seq, start)”比“reduce(operator.add, seq, start)”更快,更容易理解。(2.3b1 新增。)
- enumerate()- 一个迭代器,接受一个序列并返回 (索引, 项) 元组。这更优雅地解决了旧的“for i in range(len(seq))”问题。(PEP 279)
- basestring- 一个抽象字符串类型,是 str(8 位字符串)和 unicode 的基类。主要用于简化字符串类型的测试,例如 isinstance(x, basestring)。
- bool, True, False- 这些在 Python 2.2.1 中作为 int 引入,但现在是单独的类型(int 的子类型)。这意味着 True 和 False 现在分别打印为字符串 'True' 和 'False'。自 2.3b1 起,不带参数的 bool() 返回 False。(PEP 285)
- compile(), eval(), exec- 完全支持 Unicode,并且当其输入不以换行符结尾时不再发出 SyntaxError。(2.3a2 新增。)
- range()- 自 2.3b1 起,支持 magnitude 大于 sys.maxint 的长整型参数。例如,range(2**100, 2**101, 2**100) 是以下列表:[1267650600228229401496703205376L]。
- dict()- 字典构造的两个新特性:dict() 构造函数的关键字参数现在是根据键/值对创建字典的简写,dict.fromkeys(iterable) 返回一个字典,其键取自给定的可迭代对象(值默认为 None)。此外还添加了一个新的字典方法 pop(key),它移除并返回与给定键对应的值。
- filter()- 当输入是 Unicode 时现在返回 Unicode。修复了内置类型子类的各种错误。(2.3a2 新增。)
- int()- 当转换包含许多数字的字符串时,现在可以返回 long 类型,而不是引发 OverflowError。(2.3a2 新增:当对无符号十六进制或八进制字面量进行符号折叠时,会发出 FutureWarning。)
- isinstance(), super()- 现在支持 type() 不等于其 __class__ 的实例。(2.3a2 新增。)自 2.3b1 起,super() 不再忽略数据描述符,除了 __class__。
- raw_input()- 现在可以返回 Unicode 对象(如果 sys.stdin 支持 Unicode)。(2.3a2 新增。)
- slice()和buffer()- 这些现在是类型而不是函数。构造函数具有与过去函数相同的签名。
- PyThreadState_SetAsyncExc()- 一个新的 API(故意仅从 C 访问)通过发送异常来中断线程。
新增或升级的模块和包
许多新的doctest来自 Jim Fulton 的扩展,除了其他增强功能外,还允许通过 unittest 运行 doctest。
csv- 支持读取和写入所谓的逗号分隔值格式文件。(2.3b1 新增。)
timeit- 用于测量代码片段执行速度的模块。(2.3b1 新增。)
platform- 找出所有你一直想了解的关于你的平台的信息,但又不敢问。(2.3b1 新增;由 Marc-Andre Lemburg 提供。)
shelve- 可选支持自动回写,并暴露 pickle 协议版本。(2.3b1 新增。)
DocXMLRPCServer- 一个自文档化的 XML 服务器库。(2.3b1 新增。)
rotor- 此模块已弃用。它太容易破解了。(2.3b1 新增。)
re- .*? 模式现在特殊处理以避免递归限制。(2.3b1 新增。)
Bastion和rexec- 这些模块被禁用,因为它们在 Python 2.3(以及 Python 2.2)中不安全。(2.3a2 新增。)
bsddb- 旧的 bsddb 模块终于退役了。以前的第三方 PyBSDDB 包装器现在作为 bsddb 包在 Python 2.3 中可用。这与 Sleepycat Berkeley DB 版本 3.0 到 4.1 兼容。2.3a2 新增:Windows 安装程序现在附带 Sleepycat 的 4.1.25.NC,这是不含强加密的最新版本。
旧的 bsddb 模块代码仍然作为 bsddb185 模块可用,但默认情况下不构建。如果您仍然使用只安装了 Berkeley DB 1.85 的系统(通常通过存在 /usr/include/db.h 但不存在 /usr/lib/libdb.a 文件来指示),以下更改应能让您继续运行。
添加以下行
bsddb185 bsddbmodule.c
到 Modules/Setup。在大多数情况下,您不应需要任何 -I、-L 或 -l 标志。在那些仍然提供 1.85 的系统上,/usr/include/db.h 似乎是头文件,并且符号存在于 libc 中。
要在导入名称“bsddb”时强制使用该版本的模块作为默认值,请将以下行添加到您的 sitecustomize.py 文件中
import bsddb185 as bsddb
bz2- 与 bz2 压缩库的接口,由 Gustavo Niemeyer 提供。
datetime- Tim Peters 用 C 语言实现了一个快速、紧凑的日期和时间计算模块,范围从公元 1 年到 9999 年,并支持可选的时区。(2.3a2 新增:内容太多无法在此列出;请参阅Misc/NEWS。)
heapq- 实现了算法课程中已知的堆队列算法。代码由 Kevin O'Connor 编写,文档由 François Pinard 撰写,Tim Peters 进行了许多改进。
imaplib- 添加了 SSL 支持。
imp- 暴露了“导入锁”。(2.3a2 新增。)
itertools- 受 Haskell 和 SML 启发的,高速、内存高效的循环构造。(2.3a2 新增。)(2.3b1 中有一些改进,包括将 times() 纳入 repeat(),以及添加 chain() 和 cycle()。)
logging- 一个基于 log4j 和我们自己的 PEP 282 的灵活、可配置的日志包;由 Vinay Sajip 编写。(2.3a2 新增:warn/WARN 重命名为 warning/WARNING;日志模块实际包含在 Windows 安装程序中。)
optparse- 一个强大的命令行选项解析器,由 Greg Ward 编写(基于他的 Optik 包)。
ossaudiodev- OSS (Open Sound System) 的接口,这是 Linux 和某些 BSD 版本的标准音频 API。代码由 Greg Ward 编写,基于 Peter Bosch 的(现已弃用)linuxaudiodev 模块。(2.3a2 新增:由于驱动程序问题,除非使用“regrtest.py -u audio”,否则默认情况下不运行这些模块的测试。)
pickle, cPickle和copy- 添加了一个新的 pickle 协议,用于更高效地 pickle(特别是)新式类实例,并允许更大的 pickle 灵活性。(PEP 307)(2.3a2 新增。)
random- 现在使用新的核心生成器——梅森旋转算法。这是当前最佳实践的随机数生成器算法,经过广泛测试,周期为 2**19937-1。代码由 Raymond Hettinger 编写。
sets- 一个实现两种灵活集合数据类型的新模块。代码由 Greg V. Wilson、Alex Martelli、Tim Peters 和 Raymond Hettinger 等众多人编写。(PEP 218)
socket- 套接字现在支持所有操作上的可选超时。代码由 Michael Gilfix 和 Bernard Yue 编写,基于 Tim O'Malley 的 timeoutsocket.py。此功能的一些错误在 2.3b1 中得到修复;因此,所有平台现在都使用 Python 包装类来处理套接字对象。2.3b1 中还新增了对 inet_pton() 和 inet_ntop() 的支持。
ssl- Windows 安装程序现在包含 SSL 支持。(2.3a2 新增:现在正确处理了在底层套接字上设置的超时。)
Tkinter- 现在返回 Tcl 对象而不是字符串。对 Tcl/Tk 8.0 和 8.1 的支持已取消;添加了对线程化 Tcl/Tk 的支持,以及对各种 Tk 8.4 特性的支持。Windows 安装程序现在附带 Tcl/Tk 8.4.3。在 2.3b1 中,变量包装器现在也将对象直接传递给 Tcl,而不是将它们转换为字符串。
trace- 一个用于跟踪程序执行并报告代码覆盖率的工具
textwrap- 简单但有效的文本段落换行,由 Greg Ward 编写。
zipimport- 从 zipfile 导入模块,由 Just van Rossum 在 James Ahlstrom 早期代码的基础上用 C 语言实现。(2.3a2 新增:修复了在 2.3a1 中发现的几个严重错误。)
通用
- PYTHONINSPECT- 程序现在可以在 Python 中将环境变量 $PYTHONINSPECT 设置为某个字符串值,并使解释器在程序退出时进入交互式提示符,就像 Python 以 -i 选项调用一样。
- os.walk()- 基于生成器的 os.path.walk() 替代品。(2.3b1 新增。)
- os.fsync()- 现在在 Windows 上支持。(2.3b1 新增。)
- winsound.MessageBeep()- Windows 上的新函数。(2.3b1 新增。)
- time.tzset()- 平台 tzset() 的接口。(2.3b1 新增。)
- sys.getfilesystemencoding()- 返回文件系统默认编码。(2.3b1 新增。)
- sys.exc_clear()- 清除当前异常(sys.exc_type 等)。(2.3b1 新增。)
- sys.call_tracing()- 允许 pdb 递归调试代码。(2.3b1 新增。)
- gc.get_referents()- 返回对象直接引用的对象列表。(2.3b1 新增。)
- dict.pop()- 现在接受一个可选参数,指定如果键不在字典中则返回的默认值。(2.3b1 新增。)
- list.insert(i, x)现在将负数 i 解释为切片所解释的方式,因此负值从列表末尾开始计数。(2.3b1 新增。)自 2.3b2 起,list.index() 现在接受可选的 start 和 end 参数。
- 不定义 __new__ 或 __init__ 的新式类不再忽略构造函数参数。(2.3a2 新增。)
- 带负号前缀的十六进制/八进制字面量处理不一致。这已根据 PEP 237 修复。(2.3a2 新增。)
- 函数现在也具有 __module__ 属性。(2.3a2 新增。)
- 将浮点数传递给期望整数的 C 函数现在会发出 DeprecationWarning;将来这将成为 TypeError。(2.3a2 新增。)
- distutils 的包索引和元数据。这是对 Python 目录的支持,现在在 cheeseshop.python.org/pypi 上开放业务。(PEP 301)
- 默认情况下支持生成器——'yield' 始终是关键字,'from __future__ import generators' 不再是必需的(但仍然允许)。(PEP 255)
- 扩展切片- 标准序列类型(字符串、列表等)现在支持扩展切片。巧妙之处:s[::-1] 反转字符串。
- None- 对名为 None 的变量或属性赋值现在会触发警告。将来,None 可能会成为关键字。
- 新式类现在允许对__name__和__bases__.
- 赋值。内部化字符串不再是不朽的。
- sys.setcheckinterval()- 此功能的默认值已从 10 更改为 100,以加快交错多个线程的执行速度(通过减少线程切换频率)。
- 通用换行符- 以特殊模式“U”(而不是“r”)打开以供读取的文件将所有三种常见的行尾约定(n、r、rn)转换为 Python 的标准 n 约定。由 Jack Jansen 贡献。(PEP 278)
- 编码声明- 您可以在 Python 源文件的第一行或第二行放置形如“# -- coding: <encodingname> --”的注释,以指示编码(例如 utf-8)。(PEP 263 阶段 1)
- 编解码器错误处理回调- 这允许灵活处理编码错误。(PEP 293)
- 文件对象现在是它们自己的迭代器。这使得对同一文件的多次中断迭代更加可靠。xreadlines() 方法和模块现在已弃用。
- func_namein运算符现在可用于子字符串测试,例如 'ca' in 'abracadabra' 返回 True。
- 从 zipfile 导入- 放置在 sys.path(或 $PYTHONPATH 中)的 zipfile 名称会导致 import 在 zipfile 中查找模块和包。还提供了其他导入钩子。代码由 Just van Rossum 基于 James Ahlstrom 的想法实现。(PEP 273 和 PEP 302。)
- 在支持 Unicode 文件名的平台上(特别是 NT/2000/XP 类型的 Windows)。(PEP 277)
- 一个新警告,FutureWarning,针对某些使用看起来是无符号但实际上是负数的十六进制或八进制常量、可能丢失位或改变符号的左移以及某些到十六进制或八进制的转换发出。
- Tim Peters 重写了他的list.sort()实现——这是一个“稳定排序”(相等输入在输出中以相同顺序出现)并且比以前更快。
- Tim Peters 还根据 Christopher A. Craig 的补丁,将长整数乘法更改为使用 Karatsuba 算法。这加快了超长整数的乘法运算。