注意: 虽然 JavaScript 对于本网站并非必要,但您与内容的交互将受到限制。请启用 JavaScript 以获得完整体验。

说明

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

Python 2.4 最终版的新特性?

发布日期:2004 年 11 月 30 日

核心和内置

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

Python 2.4 的新特性(候选版本 1)

发布日期:2004 年 11 月 18 日

核心和内置

  • 错误 1061968:在 2.4a3 中修复的线程错误 1010677 重新引入了存在多年的线程关闭竞争错误 225673。抛开数字历史不谈,所有三个报告中的所有错误现在都已修复。

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

构建

  • 错误 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 软件基金会许可证版本 2。

核心和内置

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

扩展模块

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

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

构建

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

Python 2.4 beta 1 的新特性?

发布日期:2004 年 10 月 15 日

核心和内置

  • 补丁 #975056:在 BSD 系统上未正确禁用可重启信号。一致使用 PyOS_setsig() 而不是 signal()。
  • 线程本地存储 (TLS) 的内部可移植实现,由PyGILState_Ensure()/PyGILState_Release()API 使用,线程不正确。这可能导致各种问题,包括段错误。有关示例,请参见错误 1041645。
  • 添加了一个命令行选项 -m 模块,该选项在 sys.path 中搜索模块,然后运行它。(由 Nick Coghlan 贡献。)
  • 字节码优化器现在将常量元组折叠为一个常量。
  • SF 错误 #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:distutils 现在遵守环境变量 LDSHARED(如果设置)。
  • 添加了 Peter Astrand 的 subprocess.py 模块。有关详细信息,请参见 PEP 324。
  • time.strptime() 现在可以正确地转义时区和所有其他特定于区域设置的字符串以用于正则表达式特定符号。当将时区指定为“东京(标准时间)”时,在日本 Windows 下会出现中断。关闭错误 #1039270。
  • 电子邮件软件包的更新
    • email.Utils.formatdate() 增加了一个用于 HTTP 支持的 'usegmt' 参数。
    • 所有在 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 中删除。
    • 已删除对早于 2.3 的 Python 的支持(参见 PEP 291)。
    • 所有缺陷类都已重命名为以“Defect”结尾。
    • 一些 FeedParser 修复;此外,将向声称是多部分但实际上不是多部分的消息添加 MultipartInvariantViolationDefect。
    • 文档更新。
  • re 的 findall() 和 finditer() 函数现在接受可选的标志参数,就像 compile()、search() 和 match() 函数一样。此外,还记录了正则表达式对象的 findall() 和 finditer() 方法先前存在的 start 和 stop 参数。
  • rfc822 消息现在支持遍历标头。
  • 已删除(未记录的)tarfile.Tarfile.membernames;应用程序应使用 getmember 函数。
  • httplib 现在为 HTTP 状态代码提供了符号常量。
  • SF 错误 #1028306:尝试比较一个datetime.datedatetime.datetime错误地只比较了年、月和日。现在它的行为类似于混合类型比较False对于==, True对于!=,并为其他比较运算符引发TypeError。由于 datetime 是 date 的子类,因此如果需要,仍然可以通过强制使用适当的 date 方法来完成仅比较基类 (date) 成员的操作;例如,a_date.__eq__(a_datetime)当且仅当a_datea_datetime的年、月和日成员相等时才为 true。
  • 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。如果为假,则行尾的“n”将被剥离。keepends为假。
  • doctest 的文档已大大扩展,现在涵盖了所有新的公共功能(其中有很多)。
  • doctest.master被放回,并且doctest.testmod()再次更新它。 这不是一件好事,因为每次testmod()调用都会导致膨胀“隐藏的”状态doctest.master,但一些旧代码显然依赖于它。目前,我们能做的就是鼓励人们通过 doctest 的 unittest 集成功能将 doctest 连接在一起。
  • httplib 现在可以处理 ipv6 地址/端口对。
  • SF bug #1017864:ConfigParser 现在可以正确处理默认键,使用ConfigParser.optionxform在提供时对其进行处理,这与处理配置文件条目和运行时设置的选项一致。
  • SF bug #997050:记录、测试和检查 ConfigParser 中非字符串值。将 rev. 1.65 中添加的新的仅限字符串的限制移动到 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 定义。

C API

  • SF patch 1044089:新函数PyEval_ThreadsInitialized()如果已调用 PyEval_InitThreads(),则返回非零值。
  • 未记录且未使用的 extern int_PyThread_Started已被删除。
  • C API 调用PyInterpreterState_New()PyThreadState_New()是极少数被声明为在不持有 GIL 的情况下可以安全调用的两个。 然而,正如 bug 1041645 所演示的那样,这在调试版本中不是真的。 在调试版本中,Python 将PyMem调用系列重定向到 Python 的小对象分配器,以获得其额外调试功能的好处。但是,Python 的小对象分配器不是线程安全的,它依赖 GIL 来避免执行其自身锁定的开销。PyInterpreterState_New()PyThreadState_New()调用平台malloc()现在直接调用,而无需考虑构建类型。
  • PyLong_AsUnsignedLong[Mask] 现在也支持 int 对象。
  • SF patch #998993PyUnicode_DecodeUTF8StatefulPyUnicode_DecodeUTF16Stateful已被添加,它们实现了有状态解码。

测试

  • test__locale 已移植到 unittest

Mac

  • plistlib现在支持非 dict 根对象。 还有一个用于读取和写入 plist 文件的新接口readPlist(pathOrFile)writePlist(rootObject, pathOrFile)

工具/演示

  • 文本文件比较脚本ndiff.pydiff.py现在以通用换行模式读取输入文件。 这使它们免于花费大量时间来推断无用的结果,例如,具有 Windows 行尾的文件和具有 Linux 行尾的文件没有共同的行。

Python 2.4 alpha 3 中的新功能?

发布日期:2004 年 9 月 2 日

核心和内置

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

扩展模块

  • difflib 现在支持 HTML 并排差异。
  • 已为支持随机数据源的系统添加了 os.urandom。
  • Patch 1012740:可写 cStringIO 上的 truncate() 现在会将位置重置到流的末尾。这与原始 StringIO 模块一致,并避免了无意中恢复了应该被截断的数据。
  • 添加了 socket.socketpair()。
  • 向 xml.parsers.expat.XMLParser 对象添加了 CurrentByteIndex、CurrentColumnNumber、CurrentLineNumber 成员。
  • mpz、rotor 和 xreadlines 模块,所有在早期版本的 Python 中都已弃用,现在都已删除。

  • Patch #934356:如果模块定义了 __all__,则相信这一点,而不是使用启发式方法过滤掉导入的名称。
  • Patch #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 方法。
  • Patch #1006219:让 inspect.getsource 处理“@”装饰器。感谢 Simon Percivall。
  • logging.handlers.SMTPHandler.date_time 已被删除;该类现在使用 email.Utils.formatdate 生成时间戳。
  • 添加了一个新函数 tkFont.nametofont 来返回现有的字体。Font 类构造函数现在有一个额外的 exists 参数,如果为 True,则请求返回/配置现有的字体,而不是创建一个新的字体。
  • 更新了 decimal 包的 min() 和 max() 方法,以匹配通用十进制算术规范的最新版本。忽略 Quiet NaNs,并根据符号和指数对相等的值进行排序。
  • decimal 包的 Context.copy() 方法现在返回深拷贝。
  • 弃用 sys.exitfunc,转而使用 atexit 模块。sys.exitfunc 属性将保留以实现向后兼容性,而 atexit 将成为执行此操作的首选方法。
  • patch #675551:向 readline 模块添加 get_history_item 和 replace_history_item 函数。
  • 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 的微弱方法。用于 unittest 集成的较新的 doctest 功能已经做得更好,现在比以往任何时候都更强大,如果您想手动执行此操作,新的 DocTestRunner 类是一个更明智的基础。“私有名称”过滤噱头从一开始就是一个错误,并且 testmod() 早已更改为默认忽略它。如果您想过滤掉测试,新的 DocTestFinder 类可用于返回所有 doctest 的列表,并且您可以根据任何可计算的标准过滤该列表,然后再将其传递给 DocTestRunner 实例。
  • Bug #891637,patch #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 平台上使用。
  • patch #1006629:在 Solaris 8/9 上将 _XOPEN_SOURCE 定义为 500,以匹配 GCC 的定义并避免重新定义警告。
  • 检测 GNU/k*BSD 系统上(由 gnu pth pthread 模拟提供的)pthreads 支持。
  • bug #1005737, #1007249:修复了 HP-UX、IRIX 和 Tru64 的旧/传统 C 编译器上发现的几个构建问题和警告。

C API

文档

  • patch #1005936, bug #1009373:修复了使用 Acrobat 查看时包含下划线的索引条目。
  • bug #990669:如果 os.path.normpath 包含符号链接,则可能会更改路径的含义。自 1992 年以来,这已在注释中记录,但现在也在库参考中。

新平台

  • 现在支持 FreeBSD 6。

测试

Windows

  • 将 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,则可能是未被发现的堆栈溢出问题。

Mac

Python 2.4 alpha 2 中的新功能?

发布日期:2004 年 8 月 5 日

核心和内置

  • Patch #980695:为 s=s+t 和 s+=t 形式的语句实现高效的字符串串联。这将因实现方式而异。因此,对于性能敏感的代码,强烈推荐使用 str.join() 方法。

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

    @staticmethod
    def foo(bar):
    

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

  • 当导入模块 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。

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

  • 试图修复 Python 在信号处理程序和线程方面的行为混乱,由于 readline 的行为而变得复杂。这里很可能仍然存在错误。

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

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

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

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

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

  • 错误 #989185:unicode.iswide() 和 unicode.width() 被删除,东亚宽度支持被移动到 unicodedata 扩展模块。

  • 补丁 #941229:交互模式下的源代码编码现在引用 sys.stdin.encoding,而不仅仅是 ISO-8859-1。这允许非拉丁-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 错误 658254,补丁 663482]

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

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

  • 错误 #1001053。wave.open() 现在接受 unicode 文件名。

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

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

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

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

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

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

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

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

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

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

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

  • 错误 #930024:posixpath.realpath() 现在通过返回路径中未成为任何循环的一部分的最后一点来处理符号链接中的无限循环。感谢 AM Kuchling。

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

  • 错误 #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 的单元测试的 unitest 测试输出

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

    DocTestSuites。

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

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

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

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

  • optparse 模块(和测试)已升级到 Optik 1.5a1。更改

    • 在帮助文本中添加默认值的扩展:选项的帮助字符串中的字符串 "%default" 将扩展为该选项的默认值的 str(),如果没有默认值,则扩展为 "none"。
    • 错误 #955889:碰巧是字符串的选项默认值现在以与命令行中的值相同的方式处理;这允许在使用自定义类型时生成更好的帮助。可以使用 parser.set_process_default_values(False) 禁用。
    • 错误 #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 源代码发行版中找到它们。)
    • 错误 #878453:尊重用于包装帮助输出的 $COLUMNS 环境变量。
    • 功能 #988122:在传递给 OptionParser 的“description”中展开“%prog”,就像在“usage”和“version”字符串中一样。(这不是在传递给 OptionGroup 的“description”中完成的。)

C API

  • PyImport_ExecCodeModule() 和 PyImport_ExecCodeModuleEx():如果在加载模块时发生错误,它们现在会从 sys.modules 中删除模块的条目。加载模块的所有方式最终都会调用其中一种,因此这是加载模块的所有方式在语义上的错误情况变化。在极少数情况下,模块加载器可能希望将模块对象保留在 sys.modules 中,尽管模块的代码无法执行。在这种情况下,模块加载器必须安排将名称和模块对象重新插入 sys.modules 中。PyImport_ReloadModule() 已被更改为在模块重新加载失败时将原始模块对象重新插入 sys.modules 中,以便其可见语义没有改变。
  • 现在记录了大量日期时间字段提取宏,感谢 Anthony Tuininga(补丁 #986010)。

文档

  • 改进了关于在 C 中创建类型的教程。
    • 指出在分配数据成员的值之前重新分配数据成员的重要性
    • 纠正了我对 visitprocs 返回值的误解。哎。
    • 提到节省劳力的 Py_VISIT 和 Py_CLEAR 宏。
  • 对 math 模块文档进行了重大重写,以解决常见的困惑。

测试

  • 现在在使用 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 对象中的每个条目开销现在更少(一个对象而不是三个)。
  • 错误 #951851:读取某些 Windows DLL 的导入表时,Python 崩溃。
  • 错误 #215126。eval()、execfile() 和 exec 的 locals 参数现在接受任何映射类型。
  • marshal 现在共享 interned 字符串。此更改引入了新的 .pyc 魔术。
  • 错误 #966623。在 exec(, {}) 中使用 type() 创建的类没有 __module__,但 typeobject 中的代码假设它总是在那里。
  • Python 不再依赖 LC_NUMERIC 区域设置来成为“C”区域设置;因此,它不再尝试阻止更改 LC_NUMERIC 类别。
  • 错误 #952807:反序列化 datetime.date、datetime.datetime 和 datetime.time 的子类的 pickle 实例可能会产生不合理的对象。感谢 Jiwon Seo 的修复。
  • 错误 #845802:当 __init__.py 是目录时,Python 崩溃。
  • Unicode 对象收到了两个新方法:iswide() 和 width()。这些查询 Unicode TR11 中指定的东亚宽度信息。
  • 改进了元组哈希算法,以在常见情况下减少冲突。修复了错误 #942952。
  • 实现了生成器表达式 (PEP 289)。由 Jiwon Seo 编码。
  • 启用了 C 扩展函数(和内置函数)的分析 - 查看新文档和修改后的 profile 和 bdb 模块以获取更多详细信息
  • 将 file.name 设置为传递给 open 的对象(而不是新字符串)
  • 将 tracebackobject 移动到 traceback.h 并重命名为 PyTracebackObject
  • 优化了对多重赋值(如 "a,b=b,a" 和 "a,b,c=1,2,3")的字节编码。将其速度提高了 25% 到 30%。
  • 将 isinstance() 和 issubclass() 的第二个参数的元组嵌套深度限制为解释器的递归限制。修复了错误 #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 承诺的大部分剩余语义更改,除了 long 的 repr() 仍然显示尾随的 'L'。PEP 似乎承诺对与 Python 2.3 相比语义发生更改的操作发出警告,但这没有实现;我们已经经历了足够多与十六进制/八进制字面量相关的警告,我认为现在最好保持沉默。
  • 对于 str 和 unicode 对象,ljust()、center() 和 rjust() 方法现在接受一个可选参数,指定一个空格之外的填充字符。
  • 当方法对象具有可以通过函数对象或方法对象满足的属性时,通常函数对象的属性会胜出。Christian Tismer 指出这实际上是一个错误,因为这种情况仅发生在特殊方法(如 __reduce__)中,其中方法对象的版本实际上比函数的属性更合适。因此,从现在开始,所有方法属性将优先于具有相同名称的函数属性。
  • 关键错误修复,针对 SF 错误 839548:如果一个带有回调的弱引用、其回调及其弱引用的对象,都在垃圾回收的单次运行期间成为循环垃圾的一部分,则它们被拆解的顺序是不可预测的。回调可能会看到部分拆解的对象,导致立即段错误,或者,如果回调复活了垃圾对象,则会导致复活不正常的对象,从而导致后续的段错误(或其他意外情况)。从某种意义上说,这并不令人惊讶,因为 Python 的循环 gc 不了解 Python 的弱引用对象。现在它了解了。当带有回调的弱引用现在成为循环垃圾的一部分时,这些弱引用会先被清除。然后回调不会触发,从而防止了这些问题。如果您需要触发回调,那么就像没有涉及循环 gc 时一样,您需要编写代码,以便弱引用对象的生命周期比它们弱引用的对象的生命周期更长。
  • 关键错误修复,针对 SF 错误 840829:如果循环垃圾回收恰好发生在新的样式类实例的弱引用回调期间,则会导致细微的内存损坏(在发布版本中;在调试版本中,很快会可靠地发生段错误)。这已被修复。
  • 在 PYTHONSTARTUP 中设置的编译器标志现在在 __main__ 中处于活动状态。
  • 添加了两个内置类型,set() 和 frozenset()。
  • 添加了一个 reversed() 内置函数,该函数返回一个序列的反向迭代器。
  • 添加了一个 sorted() 内置函数,该函数从任何可迭代对象返回一个新的排序列表。
  • 现在可以通过 PyCObject_SetVoidPtr 在 C 级别修改 CObjects。
  • list.sort() 现在支持三个关键字参数:cmp、key 和 reverse。key 参数可以是一个具有一个参数的函数,该参数从原始记录中提取比较键:mylist.sort(key=str.lower)。reverse 参数是一个布尔值,如果为 True,则会更改排序顺序,就好像比较参数被反转一样。此外,文档已进行了修改,以保证从 Py2.3 开始的所有排序都保证是稳定的(具有相等键的记录的相对顺序不变)。
  • 添加了对 wchar_t 是否有符号的测试。有符号的 wchar_t 不能用作 Py_UNICODE 的内部 unicode 类型基础,因为 unicode 实现假设使用无符号类型。
  • 修复了长度为 1 的 Unicode 字符串缓存中的一个错误,该错误可能导致段错误。当较早的非致命错误在空闲列表中留下一个未初始化的 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__ 中的一个错误。当尝试获取 __getstate__ 属性失败时,未能清除错误会导致间歇性错误和奇怪的行为。
  • 基于其他对象的缓冲区对象不再缓存指向数据和数据长度的指针。相反,会根据需要调用相应的 tp_as_buffer 方法。
  • 已修复:如果以显式缓冲区大小 >= 1 打开文件,则重复的 close() 调用会尝试 free() 在第一次调用时已 free() 的缓冲区。

扩展模块

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

  • 缺陷 #981530:修复 shutil.rmtree() 中的 UnboundLocalError。这会影响文档中记录的行为:传递给 onerror() 处理程序的函数现在也可以是 os.listdir。
  • 缺陷 #754449:threading.Thread 对象不再使用尝试处理原始异常时引发的另一个异常来屏蔽解释器关闭期间引发的异常。
  • 根据 PEP 327 添加了 decimal.py。
  • 缺陷 #981299:rsync 现在是 urlparse 中识别的使用 URL 的“netloc”部分的协议。
  • 缺陷 #919012:shutil.move() 不会尝试将目录移动到自身中。感谢 Johannes Gijsbers。
  • 缺陷 #934282:pydoc.stripid() 现在不区分大小写。感谢 Robin Becker。
  • 缺陷 #823209:cmath.log() 现在接受可选的 base 参数,以便其 API 与 math.log() 匹配。
  • 缺陷 #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 命令现在忽略所有 .svn 目录,以及 CVS 和 RCS 目录。.svn 目录保存 Subversion 源代码控制系统的管理文件。
  • 添加了一个新模块:cookielib。用于 HTTP 客户端的自动 cookie 处理。此外,urllib2 中添加了对 cookielib 的支持,因此 urllib2.urlopen() 可以透明地处理 cookie。
  • stringprep.py 现在使用内置的 set() 而不是 sets.Set()。
  • 缺陷 #876278:modulefinder 中的无限递归
  • 缺陷 #780300:交换 LexicalHandler.startDTD 中的公共 ID 和系统 ID。依赖于错误顺序的应用程序需要更正。
  • 缺陷 #926075:修复了当存在具有相同值的不同类型模式时,sre.compile() 中为字符串或 unicode 对象返回错误模式对象的错误。
  • 向 trace.Trace 类添加了 countcallers 参数(从命令行运行时使用 --trackcalls 命令行参数)。
  • 修复了 platform.platform() 中的缓存错误,其中缓存值时没有考虑 'terse' 参数。
  • 为 profile 添加了两个新的命令行参数(输出文件和默认排序)。
  • 向 profile 模块添加了全局 runctx 函数
  • 添加了 hlist 缺失的 entryconfigure 和 entrycget 方法。
  • 为支持哈萨克字符集添加了 ptcp154 编解码器。
  • 支持 urllib2 中的非匿名 ftp URL。
  • encodings 包现在会先应用编解码器名称别名,然后再开始尝试导入编解码器模块。这简化了使用外部包(例如通过调整 encodings.aliases 中的别名字典,使用 JapaneseCodecs 包替换包含的 CJK 编解码器)覆盖内置编解码器的过程。
  • base64 现在支持 RFC 3548 Base16、Base32 和 Base64 编码和解码标准。
  • urllib2 现在支持处理器。处理器是实现 xxx_request 或 xxx_response 方法的处理程序。这些方法会为所有请求调用。
  • distutils 编译器现在按照传递给编译器的顺序编译源文件。
  • pprint.pprint() 和 pprint.pformat() 现在有额外的参数 indent、width 和 depth。
  • 补丁 #750542:pprint 现在也会漂亮打印列表、元组和字典的子类,只要它们不覆盖 __repr__()。
  • 缺陷 #848614:由于注册表项不完整,distutils 的 msvccompiler 无法找到 MSVC6 编译器。
  • httplib.HTTP.putrequest 现在可以选择省略隐式的 Accept-Encoding。
  • 补丁 #841977:modulefinder 找不到包中的扩展模块
  • 添加了 imaplib.IMAP4.thread。
  • 由于使用了 os.path.exists(),修复了 tempfile.mktemp() 中的一个小漏洞,如果可能,已切换为直接使用 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 模块现在支持迭代器和映射协议,这使得它们更适合替代字典和 shelf。
  • csv 模块的 DictReader 和 DictWriter 类现在接受关键字参数。这是初始实现中的遗漏。
  • email 包可以更好地处理一些缺少 CHARSET 字段的 RFC 2231 参数。它还包含一个当引号内出现分号时用于参数解析的补丁。
  • sets.py 现在可以在 Py2.2 下运行。此外,大多数 set 方法(但不包括运算符)的参数限制已放宽为允许任何可迭代对象。
  • _strptime.py 现在具有幕后缓存机制,用于最近使用的 TimeRE 实例以及最后五个唯一的指令模式。整个模块也变得更加线程安全。
  • random.cunifvariate() 和 random.stdgamma() 在 Py2.3 中已弃用,并在 Py2.4 中删除。
  • 缺陷 #823328:urllib2.py 的 HTTP 摘要身份验证支持再次起作用。
  • 补丁 #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 现在是默认值。
  • 当挂起删除/删除选择模式生效时,py-electric-colon 现在可以正常工作
  • py-help-at-point 不再绑定到 F1 键 - 它仍然绑定到 C-c C-h
  • 修复了当没有 ~/.pynche 文件且没有给出 -d 选项时 Pynche 崩溃的问题。

构建

  • 缺陷 #978645:Modules/getpath.c 现在在 OS X 下的 --disable-framework 构建中正确构建。
  • 如果 Python 配置了 --enable-profiling,则现在可以使用 gprof 进行分析。
  • 如果 Python 配置了 --with-tsc,现在可以使用 Pentium TSC 分析 VM。
  • 为了查找库,setup.py 现在还会查找 /lib64,以便在 AMD64 上使用。
  • 缺陷 #934635:修复了如果 KAME 堆栈具有 SCTP 支持,configure 脚本无法正确检测 getaddrinfo() 的错误。
  • 删除了对缺少 ANSI C 头文件(limits.h、stddef.h 等)的支持。
  • 不再支持需要 pthreads 的 D4、D6 或 D7 变体的系统(请参阅 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 槽共存。这很有帮助,因为当定义了 METH_O 或 METH_NOARGS 标志时,PyCFunction 可以利用优化的调用。
  • 添加了一个新函数 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

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