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()- 一个迭代器,接受一个序列,返回 (index, item) 的元组。这更优雅地解决了旧的“for i in range(len(seq))”问题。(PEP 279)
- basestring- 一个抽象的字符串类型,它是 str(8 位字符串)和 unicode 的基类。主要用于简化字符串类型的测试,即 isinstance(x, basestring)。
- bool、True、False- 这些在 Python 2.2.1 中被引入为整数,但现在是一个单独的类型(整数的子类型)。这意味着 True 和 False 现在分别打印为字符串 'True' 和 'False'。从 2.3b1 开始,不带参数的 bool() 返回 False。(PEP 285)
- compile()、 eval()、 exec- 完全支持 Unicode,并且当它们的输入不以换行符结尾时,不再发出 SyntaxError。(在 2.3a2 中新增。)
- range()- 从 2.3b1 开始,支持大小大于 sys.maxint 的长参数。例如,range(2**100, 2**101, 2**100) 是以下列表:[1267650600228229401496703205376L]。
- dict()- dict 构造的两个新特性:dict() 构造函数的关键字参数现在是根据键/值对创建字典的简写形式,而 dict.fromkeys(iterable) 返回一个字典,其键取自给定的可迭代对象(值默认为 None)。还添加了一个新的 dict 方法 pop(key),它删除并返回与给定键对应的值。
- filter()- 当输入为 Unicode 时,现在返回 Unicode。修复了内置类型子类的各种错误。(在 2.3a2 中新增。)
- int()- 现在当转换具有许多数字的字符串时,可以返回长整型,而不是引发 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_SetAsyncEnc()- 一个新的 API(特意只能从 C 访问),通过向线程发送异常来中断线程。
新的或升级的模块和包
许多新的doctestJim Fulton 的扩展,除其他增强功能外,还允许通过 unittests 运行 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 包装器现在在 Python 2.3 中可用,作为 bsddb 包。这与 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- 与 Gustavo Niemeyer 提供的 bz2 压缩库的接口。
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(开放声音系统)的接口,OSS 是 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- 从 zip 文件导入模块,由 Just van Rossum 基于 James Ahlstrom 早期的代码用 C 实现。(2.3a2 中的新特性:修复了 2.3a1 中发现的几个严重错误。)
通用
- PYTHONINSPECT- 现在程序可以在 Python 中将环境变量 $PYTHONINSPECT 设置为某个字符串值,从而使解释器在程序退出时进入交互提示符,就像使用 -i 选项调用 Python 一样。
- 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() 方法和模块现在已被弃用。
- Thein运算符现在可以用于子字符串测试,例如 'ca' in 'abracadabra' 返回 True。
- 从 zip 文件导入- 放置在 sys.path(或 $PYTHONPATH)上的 zip 文件的名称会导致 import 在 zip 文件中查找模块和包。还提供了其他导入钩子。代码由 Just van Rossum 基于 James Ahlstrom 的想法编写。(PEP 273 和 PEP 302。)
- 支持 Unicode 文件名的平台(特别是 Windows 的 NT/2000/XP 系列)。(PEP 277)
- 一个新的警告,FutureWarning,对于某些看起来是无符号的但实际上是负数的十六进制或八进制常量的使用、可能丢失位或更改符号的左移,以及某些转换为十六进制或八进制的情况发出。
- Tim Peters 重写了他的list.sort()实现 - 这是一个“稳定排序”(相等的输入在输出中以相同的顺序出现),并且比以前更快。
- Tim Peters 还更改了长整数乘法以使用 Karatsuba 算法,该算法基于 Christopher A. Craig 的补丁。这加快了非常长的整数的乘法速度。