注意: 虽然 JavaScript 对于本网站不是必需的,但您与内容的互动将受到限制。请开启 JavaScript 以获得完整的体验。

注意事项

(编辑:请查看 NEWS.help 以获取有关使用 ReST 编辑 NEWS 的信息。)

Python 2.4 最终版的新功能?

发布日期:2004 年 11 月 30 日

核心和内置功能

  • Bug 875692:改进信号处理,尤其是在使用线程时,通过强制在 PyEval_EvalFrame()“周期性”代码中提前重新执行,当 things_to_do 未被 Py_MakePendingCalls() 清除时。

Python 2.4 (候选发布版 1) 的新功能

发布日期:2004 年 11 月 18 日

核心和内置功能

  • Bug 1061968:2.4a3 中为解决线程 bug 1010677 而进行的修复重新引入了存在多年的线程关闭竞争 bug 225673。除了数字历史课之外,所有三个报告中的所有 bug 现已修复。

  • Bug 1052242:如果 atexit 处理函数引发异常,则会尝试执行剩余的处理程序。最后引发的异常会再次引发。
  • doctest新支持添加pdb.set_trace()对 doctest 的调用以一种戏剧性但肤浅的方式被破坏。已修复。
  • Bug 1065388calendarday_name, day_abbr, month_name,以及month_abbr属性模拟了月份和日名称的本地化拼写序列。由于 locale 可以随时更改,因此每当这些属性被索引时,都会重新计算正确的拼写。在最坏的情况下,索引可能是切片对象,因此每次索引时都会重新计算每个日或月名称。在通常情况下,当索引只是一个整数时,这比必要的慢得多。在这种情况下,现在只重新计算所需的单个拼写;当索引是切片对象时,现在只重新计算切片所需的拼写。
  • 补丁 1061679:已将__all__添加到 pickletools.py。

构建

  • Bug 1034277 / 补丁 1035255:移除 OS X 上针对 CoreServices 和 CoreFoundation 的核心编译。涉及移除 PyMac_GetAppletScriptFile(),该函数没有已知用户。感谢 Bob Ippolito。

C API

  • PyRange_New() 函数已弃用。

Python 2.4 Beta 2 的新功能?

发布日期:2004 年 11 月 3 日

许可证

Python 软件基金会更改了 Python 的发布许可,以移除 Python 版本号。许可没有其他更改。因此,例如,Python 2.3 的许可中所有“Python 2.3”的地方,新许可都写着“Python”。目的是为了更持久地引用 PSF 许可。例如,有些人表示他们对开源倡议的 Python 软件基金会许可条目

https://open-source.org.cn/licenses/PythonSoftFoundation.php

到处写着“Python 2.1.1”感到困惑,想知道它是否只适用于 Python 2.1.1。

新许可的官方名称是 Python Software Foundation License Version 2。

核心和内置功能

  • Bug #1055820 循环垃圾回收未能防止在 gc 期间(通过运行已死对象的 __del__ 方法、运行已死对象的弱引用上的另一个回调,或通过任何其他线程中运行的任何 Python 代码在 __del__ 或回调运行时设法获取 GIL)运行任何 Python 代码时,调用对循环垃圾的实时弱引用可以复活垃圾的疯狂变异。最可能的症状是“不可能”的AttributeError异常,似乎随机出现在弱引用对象上。解决方法是在允许任何回调运行之前清除所有指向不可达对象的弱引用。
  • Bug #1054139 _PyString_Resize() 现在会使其缓存的哈希值无效。

扩展模块

  • Bug #1048870:编译器现在为具有相同函数体的函数生成不同的代码对象。这会产生令人困惑的回溯消息,指向代码对象首次定义的函数,而不是正在执行的函数。

  • 补丁 #1056967 更改了 Template.safe_substitute() 的语义,使其在“无效”匹配组上不再引发 ValueError。现在返回分隔符。
  • Bug #1052503 pdb.runcall() 未传递关键字参数。
  • Bug #902037:XML.sax.saxutils.prepare_input_source() 现在在检查 os.path.isfile() 之前将相对路径与基路径组合。
  • whichdb 模块现在可以从命令行运行。
  • Bug #1045381:当也指定了星期几和年份时,time.strptime() 现在可以使用 %U 或 %W(一年中的第几周)推断日期。
  • Bug #1048816:修复 curses.textpad.Textbox 中行首 Ctrl-K 的 bug。
  • Bug #1017553:修复 tarfile.filemode() 中的 bug。
  • 补丁 #737473:修复即使源代码已更新并重新加载,回溯中仍显示旧源代码的 bug。

构建

  • 补丁 #1044395:FreeBSD 也允许 --enable-shared。

Python 2.4 Beta 1 的新功能?

发布日期:2004 年 10 月 15 日

核心和内置功能

  • 补丁 #975056:在 BSD 系统上,可重启信号未正确禁用。始终使用 PyOS_setsig() 而不是 signal()。
  • 线程本地存储 (TLS) 的内部可移植实现,由PyGILState_Ensure()/PyGILState_Release()API 使用,不是线程安全的。这可能导致各种问题,包括段错误。有关示例,请参见 bug 1041645。
  • 添加了一个命令行选项 -m module,它会在 sys.path 中搜索模块,然后运行它。(由 Nick Coghlan 贡献。)
  • 字节码优化器现在将常量元组折叠成单个常量。
  • SF bug #513866:浮点/长整型比较异常。在 2.4b1 之前,当整数与浮点数比较时,整数会被强制转换为浮点数。这可能导致错误的溢出错误(如果整数非常大),并导致诸如long(1e200)+1 == 1e200 == long(1e200)-1之类的异常。不再执行强制转换为浮点数的操作,现在可以正确计算诸如long(1e200)-1 < 1e200, long(1e200)+1 > 1e200(1 << 20000) > 1e200的情况。

扩展模块

  • collections.deque对象与垃圾回收不太兼容,这可能导致在发布版本中出现段错误,或在调试版本中出现断言失败。此外,添加了溢出检查,更好地检测迭代期间的变异,并屏蔽了 deque 比较以防止异常的 __iter__() 方法子类重写。

  • 补丁 1046644:distutils build_ext 增加了两个新选项——--swig 用于指定要使用的 swig 可执行文件,以及 --swig-opts 用于指定要传递给 swig 的选项。--swig-opts="-c++" 是 --swig-cpp 的新写法。
  • 补丁 983206:如果设置了环境变量 LDSHARED,distutils 现在会遵守它。
  • 添加了 Peter Astrand 的 subprocess.py 模块。有关详细信息,请参见 PEP 324。
  • time.strptime() 现在会正确转义时区和所有其他特定于区域设置的字符串中的正则表达式特定符号。在日语 Windows 下,当将时区指定为“Tokyo (standard time)”时,它会出错。关闭 bug #1039270。
  • email 包的更新
    • email.Utils.formatdate() 增加了一个 'usegmt' 参数以支持 HTTP。
    • 所有在 email 2.x 中发出警告的已弃用 API 都已移除:MIMEText 构造函数的 _encoder 参数、Message.add_payload()、Utils.dump_address_pair()、Utils.decode()、Utils.encode()。
    • 新弃用:Generator.__call__()、Message.get_type()、Message.get_main_type()、Message.get_subtype()、Parser 构造函数的 'strict' 参数。这些将在 email 3.1 中移除。
    • 已移除对 Python 2.3 之前版本的支持(参见 PEP 291)。
    • 所有缺陷类都已重命名为以“Defect”结尾。
    • 一些 FeedParser 修复;此外,如果消息声称是多部分的但实际上不是,则会添加 MultipartInvariantViolationDefect。
    • 文档更新。
  • re 的 findall() 和 finditer() 函数现在接受一个可选的 flags 参数,就像 compile()、search() 和 match() 函数一样。此外,还记录了正则表达式对象的 findall() 和 finditer() 方法的先前存在的 start 和 stop 参数。
  • rfc822 消息现在支持迭代标头。
  • 已移除(未文档化的)tarfile.Tarfile.membernames;应用程序应使用 getmember 函数。
  • httplib 现在为 HTTP 状态码提供符号常量。
  • SF bug #1028306:尝试比较一个datetime.date和一个datetime.datetime错误地只比较了年份、月份和日期。现在它表现得像一个混合类型比较False表示==, True表示!=,并对其他比较运算符引发TypeError。因为 datetime 是 date 的子类,如果需要,仍然可以通过强制使用适当的日期方法来比较基类(date)成员;例如,a_date.__eq__(a_datetime)当且仅当a_datea_datetime
  • 的年份、月份和日期成员相等时才为真。
  • bdist_rpm 现在支持命令行选项 --force-arch、{pre,post}-install、{pre,post}-uninstall 和 {prep,build,install,clean,verify}-script。SF 补丁 #998993:UTF-8 和 UTF-16 有状态解码器现在支持解码不完整的输入(当输入流暂时耗尽时)。codecs.StreamReader现在实现了缓冲,这使得 UTF-16 解码器能够正确支持 readline。codecs.StreamReader.read()有一个新参数chars,它指定要返回的字符数。codecs.StreamReader.readline()codecs.StreamReader.readlines()有一个新参数keepends有一个新参数。如果为 false,则将从行中剥离尾随的“n”。
  • doctest 的文档得到了极大的扩展,现在涵盖了所有新的公共功能(其中有很多)。
  • doctest.master已恢复,并且doctest.testmod()再次更新它。这不好,因为每次testmod()调用都会导致doctest.masterdoctest.master
  • 的“隐藏”状态膨胀,但一些旧代码显然依赖于它。目前,我们所能做的就是鼓励人们通过 doctest 的 unittest 集成功能将 doctest 缝合在一起。
  • httplib 现在处理 IPv6 地址/端口对。SF bug #1017864:ConfigParser 现在正确处理默认键,在提供时使用ConfigParser.optionxform
  • 处理它们,与配置文件的条目和运行时设置选项的处理保持一致。

构建

  • SF bug #997050:文档、测试并检查 ConfigParser 中的非字符串值。将 rev. 1.65 中添加的新字符串-only 限制移至 SafeConfigParser 类,保留现有 ConfigParser 和 RawConfigParser 行为不变,并记录了非字符串值适用的条件。
  • 在 darwin 上构建现在包括 /opt/local/include 和 /opt/local/lib,用于构建扩展模块。这是为了包含作为 DarwinPorts 端口安装的软件 <http://darwinports.opendarwin.org/>pyport.h 现在定义了一个 Py_IS_NAN 宏。当平台 C 计算 x != x 为真当且仅当 X 是 NaN 时,它按原样工作。其他平台可以在该平台的 pyconfig.h 中使用平台特定的拼写覆盖默认定义。您现在还可以覆盖 pyport.h 的默认 Py_IS_INFINITY 定义。SF 补丁 1044089:新函数

C API

  • PyEval_ThreadsInitialized()如果已调用 PyEval_InitThreads(),则返回非零值。未文档化且未使用的 extern int
  • _PyThread_Started已移除。C API 调用
  • PyInterpreterState_New()PyThreadState_New()是少数几个被宣传为在不持有 GIL 的情况下安全调用的函数之一。然而,在调试构建中,这并不正确,正如 bug 1041645 所演示的那样。在调试构建中,Python 将PyMem系列调用重定向到 Python 的小对象分配器,以获得其额外的调试功能。但是 Python 的小对象分配器不是线程安全的,它依赖 GIL 来避免执行自己的锁定的开销。现在直接调用平台PyThreadState_New()是少数几个被宣传为在不持有 GIL 的情况下安全调用的函数之一。然而,在调试构建中,这并不正确,正如 bug 1041645 所演示的那样。在调试构建中,Python 将malloc(),无论构建类型如何。PyLong_AsUnsignedLong[Mask] 现在也支持 int 对象。
  • SF 补丁 #998993
  • PyUnicode_DecodeUTF8StatefulPyUnicode_DecodeUTF16Stateful已添加,它们实现了有状态解码。测试

test__locale 已移植到 unittest

  • Mac

plistlib

  • 现在支持非字典根对象。还有一个用于读写 plist 文件的新接口:readPlist(pathOrFile)writePlist(rootObject, pathOrFile)工具/演示

文本文件比较脚本

  • ndiff.pydiff.py现在以通用换行符模式读取输入文件。这避免了它们花费大量时间推断无用的结果,例如,一个带有 Windows 换行符的文件和一个带有 Linux 换行符的文件没有共同的行。Python 2.4 Alpha 3 的新功能?

发布日期:2004 年 9 月 2 日

SF 补丁 #1007189

核心和内置功能

  • from ... import ...语句现在允许名称列表被括号括起来。由于 Trevor Perrin 的努力,长整数算术得到了一些加速。通过优化 C 代码,学校乘法略有加速。学校平方运算加速了大约 2 倍,因为在平方中,大约一半的数字乘积是重复的。由于幂运算经常使用平方,这也加速了长整数幂运算。例如,我的机器上计算 17**1000000 的时间从大约 14 秒下降到 9 秒。Karatsuba 乘法的截止值提高了,因为学校乘法变快了,而且截止值无论如何都过于小。幂运算算法从右到左切换到左到右,这对于小底数更有效。此外,如果指数很大,算法现在一次处理 5 位(而不是 1 位)。这使我的机器上计算 17**1000000 的时间再次减半,降至约 4.5 秒。
  • 不再生成 OverflowWarning。PEP 237 计划在 Python 2.3 中发生这种情况,但由于 OverflowWarning 默认禁用,没有人意识到它仍在生成。万一用户代码仍在 L 用它们,Python 内置的 OverflowWarning 和相应的 C API PyExc_OverflowWarning 将存在直到 Python 2.5。
  • Py_InitializeEx 已添加。
  • 修复装饰器应用的顺序。正确的顺序是从下到上;列出的第一个装饰器是最后调用的。
  • SF 补丁 #1005778。修复在调用 list.index() 时列表大小发生变化导致的段错误。如果富比较函数修改了列表,则可能发生这种情况。
  • 用户定义函数的
  • func_name(也称为__name__)属性现在是可写的。code_new (也称为 new.code()) 现在足够仔细地检查其参数,以至于将它们传递给 PyCode_New() 不会触发对 Py_FatalError() 或 PyErr_BadInternalCall() 的调用。返回的代码对象仍然可能完全不健全。
  • 字符串的子类不再能被实习。实习的语义在这里不清楚——例如,子类可以是可变的——并且存在 bug。通过 intern() 显式实习字符串的子类将引发 TypeError。尝试实习字符串子类的内部操作将不起作用。
  • Bug 1003935:xrange() 可能会报告虚假的 OverflowErrors。已记录 xrange() 的意图,并相应修复了测试。
  • difflib 现在支持 HTML 并排差异。

扩展模块

  • 已为支持随机数据源的系统添加 os.urandom。
  • 补丁 1012740:可写 cStringIO 上的 truncate() 现在将位置重置到流的末尾。这与原始 StringIO 模块一致,并避免了无意中复活应该已被截断的数据。
  • 已添加 socket.socketpair()。
  • 已将 CurrentByteIndex、CurrentColumnNumber、CurrentLineNumber 成员添加到 xml.parsers.expat.XMLParser 对象。
  • mpz、rotor 和 xreadlines 模块(在早期版本的 Python 中均已弃用)现已移除。
  • 补丁 #934356:如果模块定义了 __all__,则相信它,而不是使用启发式方法过滤掉导入的名称。

  • 补丁 #941486:添加了 os.path.lexists(),它对损坏的符号链接返回 True,这与 os.path.exists() 不同。
  • random 模块现在如果 os.urandom() 可用,则使用它进行种子设置。添加了一个基于 os.urandom() 的新生成器。
  • difflib 和 diff.py 现在可以生成 HTML。
  • bdist_rpm 现在在 BuildRoot 中包含版本和发行版,并将版本和发行版中的“-”替换为
  • “_”。_distutils build/build_scripts 现在有一个 -e 选项,用于指定已安装脚本的 Python 解释器路径。
  • PEP 292 类 Template 和 SafeTemplate 已添加到字符串模块中。
  • tarfile 现在默认生成 GNU tar 文件。
  • HTTPResponse 现在有一个 getheaders 方法。
  • 补丁 #1006219:让 inspect.getsource 处理 '@' 装饰器。感谢 Simon Percivall。
  • logging.handlers.SMTPHandler.date_time 已移除;该类现在使用 email.Utils.formatdate 生成时间戳。
  • 添加了一个新函数 tkFont.nametofont 以返回现有字体。Font 类构造函数现在有一个额外的 exists 参数,如果为 True,则请求返回/配置现有字体,而不是创建新字体。
  • 更新了 decimal 包的 min() 和 max() 方法,以匹配通用十进制算术规范的最新修订。静默 NaN 被忽略,相等值根据符号和指数进行排序。
  • decimal 包的 Context.copy() 方法现在返回深层副本。
  • sys.exitfunc 已弃用,取而代之的是 atexit 模块。sys.exitfunc 属性将保留以实现向后兼容性,而 atexit 将成为唯一推荐的实现方式。
  • 补丁 #675551:将 get_history_item 和 replace_history_item 函数添加到 readline 模块。
  • bug #989672:pdb.doc 以及 pdb.Pdb 类的 help_d 和 help_u 方法的帮助消息已更正。d(own) 转到较新的帧,u(p) 转到较旧的帧,而不是反过来。
  • bug #990669:os.path.realpath() 将在规范化路径之前解析符号链接,因为规范化路径可能会在包含符号链接时改变路径的含义。
  • bug #851123:shutil.copyfile 在尝试将文件复制到指向自身的链接时会引发异常。感谢 Gregory Ball。
  • bug #570300:修复 inspect 以使用 os.path.realpath() 解析文件位置,以便在模块本身通过符号链接访问时正确列出模块中的所有函数。感谢 Johannes Gijsbers。
  • doctest 重构仍在进行中。有关详细信息,请参阅文档。作为这项工作的一部分,一些旧的、很少(从不?)使用的功能现已弃用:Tester 类、模块 is_private() 函数以及 testmod() 的 isprivate 参数。Tester 类提供了一种微弱的“手动”方式来组合多个 doctest,如果你确切知道自己在做什么的话。新的 doctest 功能用于 unittest 集成已经做得更好,现在比以往任何时候都更强大,如果你想手动操作,新的 DocTestRunner 类是一个更健全的基础。从一开始,“私有名称”过滤技巧就是一个错误,testmod() 很久以前就已更改为默认忽略它。如果你想过滤掉测试,新的 DocTestFinder 类可用于返回所有 doctest 的列表,你可以在将其传递给 DocTestRunner 实例之前,根据任何可计算的条件过滤该列表。
  • Bug #891637,补丁 #1005466:修复 inspect.getargs() 在 def foo((bar)) 上的崩溃。
  • IDLE 的 Windows 快捷键现在不区分大小写,因此 Control-V 和 Control-v 的功能相同。

文本文件比较脚本

  • pygettext.py:生成 ISO 格式的 POT-Creation-Date 标头。
  • 向后不兼容:如果 SHIFT(Python 长整数“数字”中的位数)不能被 5 整除,longintrepr.h 现在会触发编译时错误。这个新要求允许新的 5 位一次 long_pow() 实现的简单代码。如有必要,可以移除此限制(通过使 long_pow() 复杂化,或退回到 1 位一次的算法),但目前没有这样做的计划。

构建

  • bug #991962:在 Darwin 上使用 --disable-toolbox-glue 构建时,不会尝试构建 Mac 特定模块。
  • 配置的 --with-tsc 标志(用于使用处理器的时间戳计数器启用 VM 分析)现在可以在 PPC 平台上运行。
  • 补丁 #1006629:在 Solaris 8/9 上将 _XOPEN_SOURCE 定义为 500,以匹配 GCC 的定义并避免重定义警告。
  • 在 GNU/k*BSD 系统上检测 pthreads 支持(由 gnu pth pthread 仿真提供)。
  • bug #1005737, #1007249:修复了在 HP-UX, IRIX 和 Tru64 的旧/传统 C 编译器上发现的几个构建问题和警告。
  • 补丁 #1005936,bug #1009373:修复在 Acrobat 中查看时包含下划线的索引条目。

C API

文档

  • bug #990669:os.path.normpath 如果包含符号链接,可能会改变路径的含义。这自 1992 年以来已在注释中记录,但现在也包含在库参考中。
  • 新平台

现在支持 FreeBSD 6。

  • 将 python.exe 和 pythonw.exe 的堆栈保留从默认的 1MB 提升到 2MB。VC 7.1 中 2.4 的堆栈帧比 VC 6.0 中 2.3.4 的堆栈帧大得多,以至于在默认的 sys.getrecursionlimit() 默认值 1000 内的深度递归程序可能会出现未检测到的 C 堆栈溢出。标准测试程序 test_compiler 就是其中之一。如果在 Windows 上,Python 进程“莫名其妙地消失”而没有任何痕迹或错误消息,但退出代码为 128,则可能是未检测到的堆栈溢出问题。

test__locale 已移植到 unittest

Windows

  • Python 2.4 Alpha 2 的新功能?

plistlib

发布日期:2004 年 8 月 5 日

补丁 #980695:实现了 s=s+t 和 s+=t 形式语句的高效字符串连接。这在不同实现中会有所不同。因此,对于性能敏感的代码,强烈建议使用 str.join() 方法。

核心和内置功能

  • PEP-0318,函数装饰器已添加到语言中。这些使用 Java 风格的 @decorator 语法实现,如下所示:

  • (PEP 需要更新以反映当前状态)

    @staticmethod
    def foo(bar):
    

    当导入模块 M 抛出异常时,Python 不再将 M 保留在 sys.modules 中。在 2.4a2 之前,它会这样做,后续导入 M 将会成功,从 sys.modules 中获取一个模块对象,该对象反映了在异常抛出之前完成的 M 初始化。后续导入没有收到 M 处于部分初始化状态的指示,导入者可能会因此陷入任意严重的麻烦(他们得到的 M 处于非预期状态,任意偏离 M 作者的意图)。现在,后续导入 M 将继续抛出异常(但是,例如,如果在导入尝试之间编辑了 M 的源代码,那么后续尝试可能会成功,或者抛出不同的异常)。

  • 这可能会破坏现有代码,但在这种情况下,代码以前可能只是偶然工作。在 Python 源代码中,唯一发现的破坏案例是在一个意外依赖于损坏模块保留在 sys.modules 中的测试中。还存在故意引发导入错误并从 sys.modules 中删除损坏模块的测试,如果这些测试无条件地执行 del sys.modules[M],那么它们现在将失败。

    u'%s' % obj 现在会首先尝试 obj.__unicode__(),如果找不到 __unicode__ 方法,则回退到 obj.__str__()。

  • 补丁 #550732:添加 PyArg_VaParseTupleAndKeywords()。类似于 PyArg_VaParse()。两者现在都已文档化。感谢 Greg Chapman。

  • 允许 .encode()/.decode() 方法在字符串和 Unicode 对象上返回字符串和 Unicode 返回类型。添加了 unicode.decode(),它没有明显原因地缺失了。

  • 尝试修复 Python 在信号处理程序和线程方面的混乱行为,再加上 readline 的行为使其复杂化。很可能这里仍然存在 bug。

  • 添加了 C 宏 Py_CLEAR 和 Py_VISIT,以简化支持垃圾回收的类型的实现。

  • 编译器现在将 None 视为常量。

  • 现在检查 __int__、__float__、__long__、__oct__ 和 __hex__ 返回的值的类型。返回无效类型将导致引发 TypeError。这与 Jython 的行为一致。

  • 在 locale 模块中实现了 bind_textdomain_codeset()。

  • 添加了 BSD 中正确字符串操作的解决方法。str.split 和 str.is* 方法现在可以正确处理 UTF-8 区域设置。

  • Bug #989185:unicode.iswide() 和 unicode.width() 已删除,东亚宽度支持已移至 unicodedata 扩展模块。

  • 补丁 #941229:交互模式下的源代码编码现在引用 sys.stdin.encoding,而不再只是 ISO-8859-1。这允许非 latin-1 用户直接编写 unicode 字符串。

  • cpickle 现在支持与 pickle 相同的关键字参数。

扩展模块

  • 添加了 ISO_8859-11、ISO_8859-16 和 TIS-620 的新编解码器和别名。

  • 感谢 Edward Loper,doctest 已经进行了大规模重构,并添加了许多新功能。完整的文档将在稍后发布。目前,doctest 模块注释和新测试用例提供了很好的覆盖。重构提供了许多自定义行为的挂钩点(例如如何报告错误,以及如何比较预期输出和实际输出)。新功能包括用于包含空白行的预期输出的 <BLANKLINE> 标记、当实际输出与预期不匹配时生成统一或上下文差异的选项、在比较之前规范化空白的选项,以及使用省略号表示“不关心”输出区域的选项。

  • Tkinter 现在支持 wish -sync 和 -use 选项。

  • time 中的以下方法支持传递 None:ctime()、gmtime() 和 localtime()。如果提供了 None,则使用当前时间(与省略参数时相同)。[SF bug 658254,补丁 663482]

  • nntplib 现在允许忽略 .netrc 文件。

  • urllib2 现在即使提供了其他身份验证方案,也能识别基本身份验证。

  • Bug #1001053。wave.open() 现在接受 Unicode 文件名。

  • gzip.GzipFile 有一个新的 fileno() 方法,用于检索底层文件对象的句柄(前提是它有一个 fileno() 方法)。如果您想在 GzipFile 上使用 os.fsync(),则需要此方法。

  • imaplib 有两个新方法:deleteacl 和 myrights。

  • nntplib 有两个新方法:description 和 descriptions。它们使用更符合 RFC 的方式来获取新闻组描述。

  • Bug #993394。修复了在使用 dummy_threading 时,解释器关闭期间从 with atexit 注册的函数中引发 'threading' 中 KeyError 的可能误报。

  • Bug #857297/补丁 #916874。修复了从 tarfile 中提取硬链接时的错误。

  • 补丁 #846659。修复了在使用 GNU longname/longlink 创建时 tarfile.py 中的错误。

  • 已删除过时的 FCNTL.py。内置的 fcntl 模块自 Python 1.5a3 以来已可用(在支持 fcntl 的平台上),而 FCNTL.py 所做的只是导出 fcntl 的名称,并在生成弃用警告后告知您直接使用 fcntl。

  • 添加了几个新的 unicode 编解码器:big5hkscs、euc_jis_2004、iso2022_jp_2004、shift_jis_2004。

  • Bug #788520。Queue.{get, get_nowait, put, put_nowait} 有了新的实现,利用了 Conditions(在 Queue 引入时不存在)。一个次要的语义更改是,非阻塞调用引发的 Full 和 Empty 异常现在仅在队列在检查时确实已满或为空时才会发生(当然,当调用线程看到这些异常时,队列可能不再已满或为空)。以前,如果实现确定队列的真实状态“仅仅不方便”(因为队列被进行中的其他方法锁定),也可能引发异常。

  • Bug #979794 和 #980117:difflib.get_grouped_opcodes() 现在处理比较两个空列表的情况。这影响了 context_diff() 和 unified_diff()。

  • Bug #980938:smtplib 现在将调试输出打印到 sys.stderr。

  • Bug #930024:posixpath.realpath() 现在通过返回路径中不属于任何循环的最后一点来处理符号链接中的无限循环。感谢 AM Kuchling。

  • Bug #980327:ntpath 不再处理压缩驱动器号和路径其余部分之间的错误斜杠。现在也明确处理 UNC 地址。感谢 Paul Moore。

  • bug #679953:zipfile.py 现在应该可以处理超过 2 GB 的文件。文件大小(压缩和未压缩)的打包数据存储为有符号而不是无符号。

  • decimal.py 现在只使用 IBM 规范中的信号。其他条件不再是公共 API 的一部分。

  • codecs 模块现在有两个新的通用 API:encode() 和 decode(),它们不限制返回类型(与同名的 unicode 和 string 方法不同)。

  • 非阻塞 SSL 套接字再次工作;它们在 Python 2.3 中已损坏。SF 补丁 945642。

  • doctest unittest 集成改进

  • o 改进了基于 doctest 的单元测试的 unittest 测试输出

    o 现在在创建 DocTestSuites 时可以传递 setUp 和 tearDown 函数。

    o 现在在创建

    DocTestSuites

  • 时可以传递 setUp 和 tearDown 函数。

  • threading 模块有一个新类 local,用于创建提供线程本地数据的对象。

  • Bug #990307:当 keep_empty_values 为 True 时,cgi.parse_qsl() 不再返回虚假的空字段。

  • 在 gettext 模块中实现了 bind_textdomain_codeset()。

  • 在 gettext 模块中引入了 l*gettext() 函数家族,这些函数返回以首选编码编码的翻译字符串,如 locale 模块的 getpreferredencoding() 所告知。

    • optparse 模块(和测试)升级到 Optik 1.5a1。更改:
    • 在帮助文本中添加默认值扩展:选项的帮助字符串中的字符串“%default”扩展为该选项默认值的 str(),如果没有默认值,则为“none”。
    • Bug #955889:选项默认值(恰好是字符串)现在以与命令行值相同的方式处理;这允许在使用自定义类型时生成更漂亮的帮助。可以通过 parser.set_process_default_values(False) 禁用。
    • Bug #960515:在为指定“type”但未指定“dest”或“metavar”的回调选项生成帮助时不要崩溃。
    • 特性 #815264:将带参数的短选项的默认帮助格式从例如“-oARG”更改为“-o ARG”;向 HelpFormatter 添加 set_short_opt_delimiter() 和 set_long_opt_delimiter() 方法,以允许(轻微)自定义格式。
    • 补丁 #736940:Optik 国际化:所有内置的面向用户的字面字符串都通过 gettext.gettext() 传递。(如果你想要翻译(.po 文件),它们不包含在 Python 中——你可以在 http://optik.sourceforge.net/ 的 Optik 源代码分发版中找到它们。)
    • Bug #878453:尊重 $COLUMNS 环境变量以包装帮助输出。

C API

  • 特性 #988122:在传递给 OptionParser 的“description”中扩展“%prog”,就像在“usage”和“version”字符串中一样。(这在传递给 OptionGroup 的“description”中是做的。)
  • PyImport_ExecCodeModule() 和 PyImport_ExecCodeModuleEx():如果加载模块时发生错误,它们现在会从 sys.modules 中删除模块的条目。所有加载模块的方式最终都会调用其中一个,因此这是所有加载模块方式的语义中的错误情况更改。在极少数情况下,模块加载器可能希望将模块对象保留在 sys.modules 中,尽管模块的代码无法执行。在这种情况下,模块加载器必须安排重新插入 sys.modules 中的名称和模块对象。PyImport_ReloadModule() 已更改为如果模块重新加载失败,则将原始模块对象重新插入 sys.modules,因此其可见语义未更改。

文档

  • 一大堆 datetime 字段提取宏现在已文档化,感谢 Anthony Tuininga(补丁 #986010)。
    • 改进了在 C 中创建类型的教程。
    • 指出在赋值其值之前重新赋值数据成员的重要性
    • 纠正我对 visitprocs 返回值的误解。哎。
  • 提及省力的 Py_VISIT 和 Py_CLEAR 宏。

test__locale 已移植到 unittest

  • math 模块文档的重大重写,以解决常见的混淆。
  • decimal 测试套件的测试数据文件现在安装在使用 Makefile 的平台上。

SF 补丁 995225:测试文件 testtar.tar 意外地包含 CVS 关键字(如 $Id: NEWS.txt 7812 2004-11-30 11:53:58Z anthony $),这可能会根据测试文件的检出方式导致 test_tarfile.py 中出现虚假故障。

Python 2.4 Alpha 1 的新功能?

核心和内置功能

  • 发布日期:2004 年 7 月 8 日
  • weakref.ref 现在也是 weakref.ReferenceType 类型的对象;它可以像任何其他新式类一样被子类化。WeakValueDictionary 对象现在每个条目的开销更少(一个对象而不是三个)。
  • Bug #951851:Python 在读取某些 Windows DLL 的导入表时崩溃。
  • Bug #215126。eval()、execfile() 和 exec 的 locals 参数现在接受任何映射类型。
  • marshal 现在共享内部字符串。此更改引入了一个新的 .pyc magic。
  • Bug #966623。在 exec(, {}) 中使用 type() 创建的类没有 __module__,但 typeobject 中的代码假定它总是存在。
  • Python 不再依赖 LC_NUMERIC 区域设置是“C”区域设置;因此,它不再尝试阻止更改 LC_NUMERIC 类别。
  • Bug #952807:取消序列化 datetime.date、datetime.datetime 和 datetime.time 子类的序列化实例可能会产生不正常的对象。感谢 Jiwon Seo 提供了修复。
  • Bug #845802:当 __init__.py 是目录时,Python 崩溃。
  • Unicode 对象收到了两个新方法:iswide() 和 width()。这些方法查询东亚宽度信息,如 Unicode TR11 中所指定。
  • 改进了元组哈希算法,以减少常见情况下的冲突。修复了 bug #942952。
  • 实现了生成器表达式 (PEP 289)。由 Jiwon Seo 编码。
  • 将 file.name 设置为传递给 open 的对象(而不是新字符串)。
  • 将 tracebackobject 移至 traceback.h 并重命名为 PyTracebackObject。
  • 优化了“a,b=b,a”和“a,b,c=1,2,3”等多重赋值的字节码。将其速度提高了 25% 到 30%。
  • 限制 isinstance() 和 issubclass() 的第二个参数中元组的嵌套深度为解释器的递归限制。修复了 bug #858016。
  • 优化了字典迭代器,为每个迭代器创建了单独的类型并使其显示其长度。还优化了方法:keys()、values() 和 items()。
  • 实现了一个新代码操作码 LIST_APPEND,它简化了列表推导式的生成字节码,并进一步提高了它们的性能(约 35%)。
  • 实现了浮点数的富比较,这使得当底层 C 编译器实际实现 C99 语义时,涉及 NaN 的比较会稍微不那么令人惊讶。
  • 优化了 list.extend() 以节省内存,并且不再创建中间序列。此外,extend() 现在在预先知道可迭代对象的长度时会预先分配所需的内存——这使列表扩展的时间减半。
  • 优化了列表大小调整操作,以减少对系统 realloc() 的调用。显著加快了列表追加、列表弹出、列表推导式和列表构造函数(当输入可迭代对象的长度未知时)的速度。
  • 更改了内部列表过度分配方案。对于较大的列表,过度分配范围在 3% 到 25% 之间。现在,它是一个常数 12%。对于较小的列表 (n<8),过度分配最多为八个元素。现在,过度分配不超过三个元素——这提高了具有大量小列表的应用程序的空间利用率。
  • 大多数列表主体现在被重用而不是释放。通过节省 malloc() 和 free() 的调用来加快列表实例化和删除。
  • dict.update() 方法现在接受与 dict() 构造函数相同的所有参数形式。这现在包括项列表和/或关键字参数。
  • 已移除对支持只读缓冲区接口的任意对象作为代码对象的 co_code 字段的支持(以前只能通过 C 代码创建)。
  • 修复了 weakref.ref() 和 weakref.proxy() 中省略回调和 None 等效的问题;None 的情况并非在所有情况下都得到正确处理。
  • 修复了 PyWeakref_NewRef() 和 PyWeakref_NewProxy() 假设在分配新的弱引用对象时,对象弱引用列表中的初始现有条目不会被移除的问题。然而,由于此时可以调用 GC,因此该假设无效。在一个真正晦涩的 GC 在创建新的弱引用对象时触发,而该引用对象已经存在一个没有回调的弱引用,并且该弱引用仅被循环垃圾引用,则可能发生内存错误。这在调试构建中始终导致段错误,但在发布构建中提供了不可预测的行为。
  • 内置函数 input() 现在遵循编译器标志,例如 __future__ 语句。SF 补丁 876178。
  • 已移除 apply() 中的 PendingDeprecationWarning。apply() 仍然已弃用,但不会发出恼人的警告。
  • 在 Python 关闭时 (Py_Finalize()),2.3 版本调用了两次循环垃圾回收,一次在模块拆卸之前,一次在模块拆卸之后。在模块拆卸之后的调用已被禁用,因为此时 Python 的大部分功能都已拆卸,以至于 __del__ 方法和弱引用回调无法正常执行。最常见的症状是 Python 关闭时 stderr 上出现一系列无信息消息,由试图引发异常的线程产生,但由于 sys 模块的大部分内容已被销毁,因此无法报告其问题的性质。
  • 移除了与十六进制/八进制字面量和转换以及左移相关的 FutureWarnings。(感谢 Kalle Svensson 提供的 SF 补丁 849227。)这解决了 PEP 237 所承诺的大多数剩余语义更改,除了长整型的 repr(),它仍然显示尾随的 'L'。PEP 似乎承诺对与 Python 2.3 相比更改了语义的操作发出警告,但这并未实现;我们已经受够了与十六进制/八进制字面量相关的警告,我认为现在最好保持沉默。
  • 对于 str 和 unicode 对象,ljust()、center() 和 rjust() 方法现在接受一个可选参数,指定除空格以外的填充字符。
  • 当方法对象具有可以通过函数对象或方法对象满足的属性时,通常函数对象的属性获胜。Christian Tismer 指出这是一个错误,因为这只发生在特殊方法(如 __reduce__)中,方法对象的版本实际上比函数的属性更合适。因此从现在开始,所有方法属性都将优先于同名的函数属性。
  • 关键 bug 修复,针对 SF bug 839548:如果带有回调的弱引用、其回调以及其弱引用对象都在一次垃圾回收运行中成为循环垃圾的一部分,则它们被拆卸的顺序是不可预测的。回调可能会看到部分拆卸的对象,导致立即段错误,或者,如果回调复活了垃圾对象,则复活不正常的对象,导致稍后发生段错误(或其他意外情况)。从某种意义上说,这并不令人惊讶,因为 Python 的循环 gc 不了解 Python 的弱引用对象。现在它知道了。当带有回调的弱引用现在成为循环垃圾的一部分时,这些弱引用首先被清除。回调不会触发,从而防止了问题。如果您需要触发回调,那么就像不涉及循环 gc 时一样,您需要编写代码,使弱引用对象的生命周期长于它们弱引用的对象。
  • 关键 bug 修复,针对 SF bug 840829:如果在新式类实例的弱引用回调期间恰好发生循环垃圾回收,则结果是微妙的内存损坏(在发布构建中;在调试构建中,很快就会可靠地发生段错误)。这已修复。
  • PYTHONSTARTUP 中设置的编译器标志现在在 __main__ 中激活。
  • 添加了两种内置类型:set() 和 frozenset()。
  • 添加了一个 reversed() 内置函数,它返回一个序列的反向迭代器。
  • 添加了一个 sorted() 内置函数,它从任何可迭代对象返回一个新的排序列表。
  • CObjects 现在可以通过 PyCObject_SetVoidPtr 进行可变(在 C 级别)。
  • list.sort() 现在支持三个关键字参数:cmp、key 和 reverse。key 参数可以是一个接受一个参数的函数,用于从原始记录中提取比较键:mylist.sort(key=str.lower)。reverse 参数是一个布尔值,如果为 True,则会改变排序顺序,就像比较参数被反转一样。此外,文档已修改,以保证从 Py2.3 开始的所有排序都是稳定的(具有相同键的记录的相对顺序不变)。
  • 增加了对 wchar_t 是否有符号的测试。有符号的 wchar_t 不能用作 Py_UNICODE 的内部 Unicode 类型基,因为 Unicode 实现假定是无符号类型。
  • 修复了长度为一的 Unicode 字符串缓存中的一个 bug,该 bug 可能导致段错误。具体问题发生在早期,非致命错误在空闲列表中留下了一个未初始化的 Unicode 对象时。
  • % 格式化运算符现在支持 '%F',它等效于 '%f'。这在文档中一直有说明,但从未实现。
  • 如果 obj 不是字符串或数字,complex(obj) 可能会泄漏少量内存。
  • 不带参数的 zip() 现在返回一个空列表,而不是引发 TypeError 异常。
  • obj.__contains__() 现在返回 True/False 而不是 1/0。SF 补丁 820195。
  • Python 不再尝试智能地处理递归比较。当比较具有循环引用的容器时,它现在只会达到递归限制。请参见 SF 补丁 825639。
  • str 和 unicode 内置类型现在有一个 rsplit() 方法,它与 split() 相同,只是它从字符串的末尾向开头扫描。请参见 SF 功能请求 801847。
  • 修复了在使用协议 2 时 object.__reduce_ex__ 中的 bug。当尝试获取 __getstate__ 属性失败时未能清除错误导致了间歇性错误和异常行为。
  • 基于其他对象的缓冲区对象不再缓存指向数据和数据长度的指针。相反,根据需要调用适当的 tp_as_buffer 方法。
  • 已修复:如果文件以显式缓冲区大小 >= 1 打开,则重复的 close() 调用将尝试释放已在第一次调用时释放的缓冲区。

扩展模块

  • 添加了 socket.getservbyport(),并使 getservbyname() 和 getservbyport() 中的第二个参数变为可选。
  • time 模块中处理输入 POSIX 时间戳的代码现在将引发 ValueError,如果在将时间戳转换为平台 C time_t 类型时损失了超过一秒的精度。在这种情况下,平台不会对结果进行任何有意义的处理。这包括 ctime()、localtime() 和 gmtime()。datetime 模块中的各种 fromtimestamp() 和 utcfromtimestamp() 方法也受到了保护。关闭 bug #919012 和 975996。
  • fcntl.ioctl 现在在未指定 mutate 标志时发出警告。
  • nt 现在允许正确引用 UNC 根,例如在 nt.stat() 中。
  • weakref 模块现在支持其他对象:array.array、sre.pattern_objects、文件对象和套接字。
  • operator.isMappingType() 和 operator.isSequenceType() 现在产生的假阳性更少。
  • socket.sslerror 现在是 socket.error 的子类。还在 socket 模块的 C API 中添加了 socket.error。
  • Bug #920575:已修复 _locale 模块在 nl_langinfo(ERA) 上因 GNU libc 的非法 NULL 返回而导致的段错误问题。
  • 数组对象现在支持复制模块。此外,它们的调整大小方案已更新,以匹配列表对象使用的方案。这提高了 append() 操作的性能(速度和内存使用)。此外,array.array() 和 array.extend() 现在接受任何可迭代参数,用于重复追加,而无需创建另一个临时数组。
  • cStringIO.writelines() 现在接受任何可迭代参数,并逐行写入,而不是将它们连接起来一次性写入。对 StringIO.writelines() 进行了并行更改。节省内存并使其适用于生成器表达式。
  • time.strftime() 现在检查其时间元组参数中的值是否在适当的边界内,以防止平台 C 库 strftime() 实现可能导致的崩溃。这可能会破坏以前不会导致问题(例如将一年中的某天设置为 0)的使用超出范围值的代码。修复了 bug #897625。
  • 如果系统具有 <bluetooth/bluetooth.h>,则 socket 模块现在支持蓝牙套接字。
  • 添加了一个 collections 模块,其中包含一个新的数据类型 deque(),它提供了高性能、线程安全、内存友好的在 deque 两端进行追加和弹出的操作。
  • 几个模块现在利用 collections.deque() 改进了性能:Queue、mutex、shlex、threading 和 pydoc。
  • operator 模块有两个新函数:attrgetter() 和 itemgetter(),它们对于创建用于 map()、list.sort()、itertools.groupby() 和其他需要函数参数的快速数据提取函数很有用。
  • 添加了 socket.SHUT_{RD,WR,RDWR}。
  • 添加了 os.getsid。
  • pwd 模块错误地将其结构类型宣传为 struct_pwent;这已重命名为 struct_passwd。(旧名称仍受支持以实现向后兼容性。)
  • xml.parsers.expat 模块现在提供 Expat 1.95.7。
  • 添加了 socket.IPPROTO_IPV6。
  • 添加了 readline.clear_history。
  • select.select() 现在接受序列作为其前三个参数。
  • cStringIO 现在支持 f.closed 属性。
  • 信号模块现在公开 SIGRTMIN 和 SIGRTMAX(如果可用)。
  • curses 模块现在支持 use_default_colors()。[补丁 #739124]
  • Bug #811028:FreeBSD/MacOS X 上的 ncurses.h 损坏
  • Bug #814613:SGI 上所有编译器都需要 INET_ADDRSTRLEN 修复
  • 实现了非递归 SRE 匹配方案 (#757624)。
  • 在 SRE 中实现了 (?(id/name)yes|no) 支持 (#572936)。
  • 不带参数或 None 的 random.seed() 使用 time.time() 作为默认种子。已修改以匹配 Py2.2 行为并使用小数秒,以便连续运行更有可能产生不同的序列。
  • random.Random 有一个新方法 getrandbits(k),它返回一个带有 k 个随机位的 int。此方法现在是用户定义生成器 API 的可选部分。任何定义 genrandbits() 的生成器现在都可以使用 randrange() 处理长度 >= 2**53 的范围。以前,randrange 对于如此大的范围只返回偶数(参见 SF bug #812202)。现在,不定义 genrandbits() 的生成器在调用 randrange() 时,如果范围过大,会发出警告。
  • itertools 有一个新函数 groupby(),用于将可迭代对象聚合到共享相同键(由键函数确定)的组中。它提供了一些 SQL 的 groupby 关键字和 Unix uniq 过滤器的功能。
  • itertools 现在有一个新函数 tee(),它从单个可迭代对象生成两个独立的迭代器。
  • 不带参数的 itertools.izip() 现在返回一个空迭代器,而不是引发 TypeError 异常。
  • 修复了 #853061:允许 BZ2Compressor.compress() 接收空字符串作为参数。

  • Bug #981530:修复 shutil.rmtree() 中的 UnboundLocalError。这影响了文档中描述的行为:传递给 onerror() 处理程序的函数现在也可以是 os.listdir。
  • Bug #754449:threading.Thread 对象不再掩盖解释器关闭期间引发的异常,而是通过尝试处理原始异常而引发另一个异常。
  • 根据 PEP 327 添加了 decimal.py。
  • Bug #981299:rsync 现在是 urlparse 中识别的协议,它使用 URL 的“netloc”部分。
  • Bug #919012:shutil.move() 将不会尝试将目录移动到自身内部。感谢 Johannes Gijsbers。
  • Bug #934282:pydoc.stripid() 现在不区分大小写。感谢 Robin Becker。
  • Bug #823209:cmath.log() 现在接受一个可选的 base 参数,以便其 API 与 math.log() 匹配。
  • Bug #957381:distutils bdist_rpm 不再在生成 -debuginfo.rpm 的最新 RPM 版本上失败。
  • os.path.devnull 已添加到所有支持的平台。
  • 修复了 #877165:distutils 现在在 cygwin 和 mingw32 上选择正确的 C++ 编译器命令。
  • urllib.urlopen().readline() 现在正确处理 HTTP/0.9。
  • 重构了 site.py 中的函数。还为模块编写了回归测试。
  • distutils install 命令现在支持所有平台上的 --home 选项和安装方案。
  • asyncore.loop 现在有一个重复计数参数,默认为永远循环。
  • distutils sdist 命令现在除了 CVS 和 RCS 目录外,还会忽略所有 .svn 目录。.svn 目录保存 Subversion 源代码控制系统的管理文件。
  • 添加了一个新模块:cookielib。用于 HTTP 客户端的自动 cookie 处理。此外,urllib2 也已添加了对 cookielib 的支持,因此 urllib2.urlopen() 可以透明地处理 cookie。
  • stringprep.py 现在使用内置的 set() 而不是 sets.Set()。
  • Bug #876278:modulefinder 中的无界递归。
  • Bug #780300:在 LexicalHandler.startDTD 中交换公共和系统 ID。依赖错误顺序的应用程序需要更正。
  • Bug #926075:修复了当存在具有相同值但不同类型的模式时,sre.compile() 中为字符串或 Unicode 对象返回错误模式对象的 bug。
  • 将 countcallers 参数添加到 trace.Trace 类(从命令提示符运行时为 --trackcalls 命令行参数)。
  • 修复了 platform.platform() 中的缓存 bug,其中在缓存值时未考虑“terse”参数。
  • 为 profile 添加了两个新的命令行参数(输出文件和默认排序)。
  • 将全局 runctx 函数添加到 profile 模块
  • 添加 hlist 缺少 entryconfigure 和 entrycget 方法。
  • 添加了 ptcp154 编解码器以支持哈萨克字符集。
  • urllib2 支持非匿名 ftp URL。
  • encodings 包现在将首先应用编解码器名称别名,然后再尝试导入编解码器模块。这通过相应调整 encodings.aliases 中的别名字典,简化了用外部包(例如,包含的 CJK 编解码器与 JapaneseCodecs 包)覆盖内置编解码器的过程。
  • base64 现在支持 RFC 3548 Base16、Base32 和 Base64 编码和解码标准。
  • urllib2 现在支持处理器。处理器是一个实现 xxx_request 或 xxx_response 方法的处理程序。这些方法为所有请求调用。
  • distutils 编译器现在以与传递给编译器的顺序相同的顺序编译源文件。
  • pprint.pprint() 和 pprint.pformat() 现在具有额外的参数 indent、width 和 depth。
  • 补丁 #750542:pprint 现在也将漂亮打印列表、元组和字典的子类,只要它们不覆盖 __repr__()。
  • Bug #848614:由于注册表条目不完整,distutils 的 msvccompiler 未能找到 MSVC6 编译器。
  • httplib.HTTP.putrequest 现在提供省略隐式 Accept-Encoding 的选项。
  • 补丁 #841977:modulefinder 未找到包中的扩展模块。
  • imaplib.IMAP4.thread 已添加。
  • 修补了 tempfile.mktemp() 中的一个小漏洞,该漏洞是由于使用 os.path.exists() 造成的,如果可能,已切换为直接使用 os.lstat()。
  • bisect.py 和 heapq.py 现在有底层的 C 实现,以获得更好的性能。
  • heapq.py 有两个新函数:nsmallest() 和 nlargest()。
  • traceback.format_exc 已添加(类似于 print_exc 但它返回一个字符串)。
  • xmlrpclib.MultiCall 已添加。
  • poplib.POP3_SSL 已添加。
  • tmpfile.mkstemp 现在即使 dir 是相对路径也返回绝对路径。
  • urlparse 符合 RFC 2396。
  • csv 模块的 DictReader 构造函数的 fieldnames 参数现在是可选的。如果省略,文件的第一行将用作字段名列表。
  • 添加了 encodings.bz2_codec,用于通过 "a long string".encode('bz2') 访问 bz2 压缩。
  • unittest.py 的各项改进,与 PyUnit CVS 重新对齐。
  • dircache 现在将异常传递给调用者,而不是返回空列表。
  • bsddb 模块和 dbhash 模块现在支持迭代器和映射协议,这使得它们更能替代字典和 shelves。
  • csv 模块的 DictReader 和 DictWriter 类现在接受关键字参数。这是初始实现中的遗漏。
  • email 包更好地处理了一些缺少 CHARSET 字段的 RFC 2231 参数。它还包含一个补丁,用于处理分号出现在引号内的参数解析。
  • sets.py 现在在 Py2.2 下运行。此外,大多数 set 方法(但不是运算符)的参数限制已放宽,以允许任何可迭代对象。
  • _strptime.py 现在有一个幕后的缓存机制,用于最近使用的 TimeRE 实例以及最后五个独特的指令模式。整个模块也变得更线程安全。
  • random.cunifvariate() 和 random.stdgamma() 在 Py2.3 中已弃用,并在 Py2.4 中移除。
  • Bug #823328:urllib2.py 的 HTTP Digest Auth 支持再次可用。
  • 补丁 #873597:CJK 编解码器已导入到默认编解码器的级别。

文本文件比较脚本

  • Tools/scripts 目录中添加了一个 hotshotmain 脚本,使得在 hotshot 分析器控制下运行脚本变得容易。
  • db2pickle 和 pickle2db 脚本现在可以转储/加载 gdbm 文件。
  • pickle2db 脚本命令行上的文件顺序已颠倒。现在是 [ picklefile ] dbfile。这提供了与 db2pickle 更好的对称性。在同时给出两个文件的情况下,这两个脚本的文件参数现在都是源文件在前,目标文件在后。
  • pydoc 脚本将显示指向核心发行版模块文档的链接。文档基本目录默认为 https://pythonlang.cn/doc/current/lib/,但可以通过设置 PYTHONDOCS 环境变量进行更改。
  • texcheck.py 现在检测双字错误。
  • md5sum.py 错误地默认以文本模式打开输入文件,这是之前版本的一个无声且危险的更改。它再次默认以二进制模式打开输入文件。-t 和 -b 标志为了与 2.3 版本兼容而保留,但现在 -b 是默认值。
  • 当 pending-delete/delete-selection 模式生效时,py-electric-colon 现在可以工作。
  • py-help-at-point 不再绑定到 F1 键——它仍然绑定到 C-c C-h。
  • Pynche 已修复,当没有 ~/.pynche 文件且未提供 -d 选项时,它不会崩溃。

构建

  • Bug #978645:Modules/getpath.c 现在在 OS X 上使用 --disable-framework 构建时能正确构建。
  • 如果 Python 配置了 --enable-profiling,则现在可以使用 gprof 进行分析。
  • 如果 Python 配置了 --with-tsc,现在可以使用 Pentium TSC 对 VM 进行分析。
  • 为了查找库,setup.py 现在也会在 /lib64 中查找,用于 AMD64。
  • Bug #934635:修复了一个 bug,即如果 KAME 堆栈支持 SCTP,则 configure 脚本无法正确检测 getaddrinfo()。
  • 已移除对缺失 ANSI C 头文件(limits.h、stddef.h 等)的支持。
  • 不再支持需要 D4、D6 或 D7 变体 pthreads 的系统(参见 PEP 11)。
  • 通用换行符支持不再可禁用(参见 PEP 11)。
  • 已移除对 DGUX、SunOS 4、IRIX 4 和 Minix 的支持(参见 PEP 11)。
  • 已移除对需要 --with-dl-dld 或 --with-sgi-dl 的系统的支持(参见 PEP 11)。
  • 已移除对 sizeof(char) 的测试,因为 ANSI C 规定 sizeof(char) 必须为 1。

C API

  • 感谢 Anthony Tuininga,datetime 模块现在提供了一个包含类型检查宏和构造函数的 C API。有关详细信息,请参阅 Python/C API 参考手册中的新文档。
  • 添加了私有函数 _PyTime_DoubleToTimet,用于将 Python 时间戳 (C double) 转换为平台 time_t,并进行一些越界检查。在新的头文件 timefuncs.h 中声明。最好在那里公开一些其他内部 timemodule.c 函数。
  • 新的公共函数 PyEval_EvaluateFrame 和 PyGen_New 用于公开生成器对象。
  • 新增公共函数 Py_IncRef() 和 Py_DecRef(),公开 Py_XINCREF() 和 Py_XDECREF 宏的功能。对于 Python 的运行时动态嵌入很有用。参见 Bob Ippolito 的补丁 #938302。
  • 添加了一个新宏 PySequence_Fast_ITEMS,它检索一个快速序列的底层 PyObject 指针数组。对于高速循环很有用。
  • 创建了一个新的方法标志 METH_COEXIST,它导致即使方法已由槽包装器定义,也会加载该方法。例如,这允许 __contains__ 方法与定义的 sq_contains 槽共存。这很有用,因为 PyCFunction 可以利用优化的调用,只要定义了 METH_O 或 METH_NOARGS 标志。
  • 添加了一个新函数 PyDict_Contains(d, k),它类似于 PySequence_Contains(),但专门用于字典,执行速度快约 10%。
  • 添加了三个新宏:Py_RETURN_NONE、Py_RETURN_TRUE 和 Py_RETURN_FALSE。每个宏在 Py_INCREF() 它们之后返回它们所提及的单例。
  • 添加了一个新函数 PyTuple_Pack(n, ...),用于从可变长度的 Python 对象参数列表构造元组,而无需调用更复杂的 Py_BuildValue() 机制。PyTuple_Pack(3, a, b, c) 等效于 Py_BuildValue("(OOO)", a, b, c)。

Windows

  • _winreg 模块在读取非常大的注册表值时可能会出现段错误,原因是 alloca() 调用未检查(SF bug 851056)。修复方法是根据需要使用 PyMem_Malloc(n) 或 PyString_FromStringAndSize(NULL, n),然后进行大小检查。
  • 如果文件以更新模式(r+、rb+、w+、wb+)打开,并且在调用 truncate() 之前最近的文件操作是输入操作,则 file.truncate() 可能会出现异常行为。SF bug 801631。