Python 3.0 中的新特性
(编者注:请查阅 NEWS.help 以获取有关使用 ReST 编辑 NEWS 的信息。)
Python 3.0 最终版中的新特性
发布日期:2008 年 12 月 3 日
核心和内置功能
- 问题 #3996:在 Windows 上,PyOS_CheckStack 函数会导致解释器中止(“致命的 Python 错误:无法重置堆栈!”),而不是抛出 MemoryError。
- 问题 #3689:列表反向迭代器现在支持 __length_hint__ 而不是 __len__。行为现在与其他反向迭代器匹配。
- 问题 #4367:当 unicodedata 模块无法导入并且存在 N 转义时,Python 在编译期间会发生段错误。
- 修复 _cursesmodule.c 使用 -D_FORTIFY_SOURCE=2 构建时的构建失败。
库
- 问题 #4387:binascii 现在拒绝接受 str 作为二进制输入。
- 问题 #4073:向 build_scripts 添加 2to3 支持,并在 build_py 中重构该支持。
- 当启用内部调试时,IDLE 会打印“未处理的服务器异常!”消息。
- 问题 #4455:当两个窗口具有相同的标题时,IDLE 未能显示窗口列表。
- 问题 #3741:DISTUTILS_USE_SDK 设置导致 msvc9compiler.py 抛出异常。
- 问题 #4433:修复了垃圾回收 _ctypes.COMError 实例时的访问冲突。
- 问题 #4429:修复了 ctypes 中的 UnicodeDecodeError。
- 问题 #4373:纠正了 pickle 模块中潜在的引用泄漏,并消除了 distutils.tests.test_build_ext 中误报的引用泄漏。
- 问题 #4382:dbm.dumb 未指定打开文件的预期文件编码。
- 问题 #4383:当 IDLE 无法连接到其子进程时,它将无法正确显示错误消息。
构建
- 问题 #4407:修复导致 Windows 安装程序中 compileall 步骤失败的源文件。
文档
- 问题 #4449:修复了多进程示例。
- 问题 #3799:文档说明 dbm.gnu 和 dbm.ndbm 将接受字符串参数作为键和值,这些参数将在提交前转换为字节。
Python 3.0 发布候选版本 3 中的新特性?
发布日期:2008 年 11 月 20 日
核心和内置功能
- 问题 #4349:sys.path 包含一个不存在的平台目录,因为 Makefile 有缺陷。
- 问题 #3327:不要在 modules_by_index 列表中过度分配。
- 问题 #1721812:二进制集合操作和 copy() 返回输入类型而不是适当的基类型。这是不正确的,因为集合子类将在未调用其 __init__() 方法的情况下创建。纠正后的行为使集合与列表和字典保持一致。
- 问题 #4296:修复 PyObject_RichCompareBool,使“x in [x]”评估为 True,即使 x 不等于自身。这是 2.6 的回归。
- 问题 #3705:当终端不使用 UTF8 时,命令行参数未正确解码。
库
- 问题 #4363:uuid.uuid1() 和 uuid.uuid4() 函数现在即使 ctypes 模块不存在也能工作。
- FileIO 的 mode 属性现在始终包含“b”.
- 问题 #3799:修复 dbm.dumb 以接受字符串和字节作为键。字符串键现在以 UTF-8 写入。
- 问题 #4338:修复 distutils upload 命令。
- 问题 #4354:修复 distutils register 命令。
- 问题 #4116:解决 ScrolledCanvas.__init__ 中的成员名称冲突。
- 问题 #4307:inspect.getfullargspec()返回的命名元组现在使用kwonlydefaults而不是kwdefaults.
- 问题 #4298:修复当 pickle.loads 传递格式错误的输入时发生的段错误。
- 问题 #4283:修复 distutils 中遗留的“iteritems”调用。
构建
- 问题 #4389:在“添加/删除程序”中的卸载条目中添加图标。
- 问题 #4289:从 AdvancedDlg 中删除取消按钮。
- 问题 #1656675:在 Windows 上为 .py* 文件注册拖放处理程序。
工具/演示
- socketserver 模块的演示现在适用于 Python 3。
Python 3.0 发布候选版本 2 中的新特性
发布日期:2008 年 11 月 5 日
核心和内置功能
- 问题 #4211:冻结包的 __path__ 属性现在是一个列表,而不是 PEP 302 要求的字符串。
- 问题 #3727:修复了 poplib。
- 问题 #3714:通过在适当的地方使用字节修复了 nntplib。
- 问题 #1210:修复了 imaplib 及其文档。
- 问题 #4233:更改了_fileio.FileIO的close()方法在 closefd=False 的文件对象上的语义。文件描述符仍然保持打开状态,但文件对象表现得像一个已关闭的文件。FileIO对象还获得了一个新的只读属性closefd.
- 问题 #3626:在 cygwin 上,如果脚本名称只有 1 个字符长,则使用不存在的脚本名称启动 python 将不会显示任何内容。
- 问题 #4176:修复了在 pickling 一个对象的崩溃,该对象的__reduce__方法没有为第 4 和第 5 项返回迭代器。
- 问题 #3723:修复了子解释器的初始化。
- 问题 #4213:文件系统编码现在由编解码器子系统规范化,例如 UTF-8 转换为 utf-8。
- 问题 #4200:更改 atexit 模块以将其状态存储在其 PyModuleDef atexitmodule 中。这修复了多个子解释器的问题。
- 问题 #4237:io.FileIO() 正在引发无效警告,原因是 PyFileIOObject 结构成员初始化不足。
- 问题 #4170:pickling 一个 collections.defaultdict 对象会导致解释器崩溃。
- 问题 #4146:OpenBSD 上的编译已恢复。
- 问题 #3574:compile() 未正确处理编码为 Latin-1 的源代码。
- 问题 #2384 和 #3975:当源文件包含coding头时,回溯未正确打印:显示了错误的行,并且未遵守编码。
- 问题 #3740:空初始化模块状态。
- 问题 #3946:PyObject_CheckReadBuffer 在 memoryview 对象上崩溃。
- 问题 #1688:在 Windows 上,如果 input() 提示符包含非 ASCII 字符,则无法正确显示。
- Bug #3951:Py_USING_MEMORY_DEBUGGER 不应默认启用。
库
- 问题 #3664:如果 Pickler 的子类未能调用基类 __init__ 方法,则 pickle 模块可能会发生段错误。
- 问题 #3725:telnetlib 现在完全以字节工作。
- 问题 #4072:恢复 build_py_2to3。
- 问题 #4014:除了声称它是成熟的之外,不要声称 Python 处于 Alpha 发布状态。
- 问题 #3187:添加 sys.setfilesystemencoding。
- 问题 #3187:更好地支持“无法解码”的文件名。代码由 Victor Stinner 贡献,GvR 稍作修改。
- 问题 #3965:通过使其成为真正的单例对象,允许重复调用 turtle.Screen。
- 问题 #3911:ftplib.FTP.makeport() 可能会给出无效的端口号。
- 问题 #3929:当数据库无法打开时,dbm.open() 将错误地引发 TypeError:“'tuple' object is not callable”,而不是预期的 dbm.error。
- Bug #3884:再次将 turtle 模块置于顶级。
- 问题 #3547:修复了 ctypes 结构中不同整数大小的位字段。
扩展模块
- 问题 #3659:str 的子类不能作为 SQL 参数使用。
构建
- 问题 #4120:在 VS2008 中,从扩展模块中排除清单。
- 问题 #4091:再次将 pythonxy.dll 安装到 system32 中。
- 问题 #4018:在 Vista 上禁用“为我”安装。
- 问题 #4204:修复了 FreeBSD 4 上的模块构建错误。
工具/演示
- 问题 #3717:修复 Demo/embed/demo.c。
- 问题 #4072:为 build_py_2to3 添加一个 distutils 演示。
Python 3.0 发布候选版本 1 中的新特性
发布日期:2008 年 9 月 17 日
核心和内置功能
- 问题 #3827:memoryview 失去了其 size 属性,转而使用 len(view)。
- 问题 #3813:在 cygwin 上无法通过符号链接启动 python.exe。
- 问题 #3705:修复当命令行参数“-c”和“-m”给出非 ASCII 值时发生的崩溃。现在在 Linux 下行为符合预期,但在 Windows 下会在稍后失败。
- 问题 #3279:解释器在导入 site 时静默失败,因为 site 模块使用了当时未初始化的内置 open。
- 问题 #3660:纠正了 str.encode() 中的引用泄漏,当编码器不返回字节对象时。
- 问题 #3774:在 PyTokenizer_FindEncoding 中添加了一些额外的检查以处理错误情况。
- 问题 #3594:修复 Parser/tokenizer.c:fp_setreadl(),以便 PyTokenizer_FindEncoding() 可以通过文件路径或文件指针打开要分词的文件。
- 问题 #3696:OpenBSD <= 4.4 和 Cygwin 上解析参数时出错。在这些系统上,mbstowcs() 函数有点错误,必须替换为 strlen() 以计算表示多字节字符字符串所需的宽字符数。
- 问题 #3697:在 Windows 调试模式下,当执行递归限制检查代码时,很容易遇到“致命的 Python 错误:无法从堆栈溢出中恢复”,原因是启用 USE_STACKCHEK 时对递归限制的处理有误。
- 问题 3639:当传入意外类型作为参数时,_warnings 模块可能会使解释器发生段错误。
- 问题 #3712:memoryview 对象存在引用泄漏,并且不支持循环垃圾回收。
- 问题 #3668:修复 PyArg_ParseTuple 及其相关函数中“s*”参数解析器导致的内存泄漏,该泄漏发生在“s*”参数正确解析但后续参数解析失败时。
- 问题 #3611:异常 __context__ 可能会在涉及 __del__ 方法重新引发异常的复杂模式中被清除。
- 问题 #2534:将 isinstance() 和 issubclass() 的速度提高 50-70%,以匹配 Python 2.5 的速度,尽管有 __instancecheck__ / __subclasscheck__ 机制。在此过程中,修复了一个错误,即当 isinstance() 和 issubclass() 在给定类元组作为第二个参数时,它们在元组而不是每个类型对象上查找 __instancecheck__ / __subclasscheck__。
- 问题 #3663:打印 SyntaxError 时 Py_None 被减去引用计数。
- 问题 #3651:修复使用缓冲区接口或 PyArg_ParseTuple 的“s#”代码给定字节对象时发生的各种内存泄漏。
- 问题 #3657:修复 pickling 长整数时未初始化的内存读取。由 valgrind 发现。
- 应用来自 Apple 的安全补丁。
- 修复使用 failmalloc 发现的内存分配失败导致的崩溃。
- 修复使用 valgrind 发现的内存泄漏并更新抑制文件。
- 修复 opt 模式下的编译器警告,这些警告会导致无效的内存读取。
- 修复 decimal 模块中使用错误名称的问题,由 pychecker 报告。
- 问题 #3650:修复了 bytes.split('x') 中的引用泄漏。
- bytes(o) 现在尝试使用 o.__bytes__(),然后再使用回退。
- 问题 #1204:配置脚本现在测试链接 readline 时可能需要的额外库。这修复了某些平台(一些 Linux 发行版和 OpenBSD)上 x86_64 构建的问题。
C API
- 添加了 PyObject_Bytes 和 PyBytes_FromObject。
库
- 问题 #3756:使 re.escape() 能够处理字节和字符串。
- 问题 #3800:修复 formatter.py 中与 filter() 相关的问题。
- 问题 #874900:修复 fork 后 threading 模块的行为。
- 问题 #3535:zipfile 无法读取一些大于 2GB 的 zip 文件。
- 问题 #3776:废弃 bsddb 包,在 3.0 中移除。
- 问题 #3762:如果 python 通过其符号链接启动,platform.architecture() 会失败。
- 问题 #3660:修复 pickle 模块的 C 加速器中的内存泄漏。
- 问题 #3160:“bdist_wininst”distutils 命令不起作用。
- 问题 #1658:tkinter 在 tkinter.BaseWidget 和 tkinter.scrolledtext.ScrolledText 中迭代时更改字典大小。
- bsddb 模块(以及 dbm.bsd 模块)已被移除。它现在在标准库之外维护,地址为 http://www.jcea.es/programacion/pybsddb.htm。
- 问题 600362:将 parse_qs() 和 parse_qsl() 从 cgi 模块重新定位到 urlparse 模块。在旧模块中添加了 DeprecationWarning,将来将废弃。
- 问题 #3719:如果 Python 二进制文件的路径中包含空格,platform.architecture() 会失败。
- 问题 3602:作为 r66135 合并的一部分,将 warnings.catch_warnings() 的参数设为仅限关键字。同时移除一个 DeprecationWarning。
- 移除了 camelCase threading API 名称的废弃警告。
- 问题 #3110:multiprocessing 由于缺少 SEM_VALUE_MAX 而无法在 solaris 10 上编译。
扩展模块
- 问题 #3782:os.write() 不得接受 unicode 字符串。
- 问题 #2975:当使用同一 Python 解释器编译多个 Visual Studio 2008 扩展模块时,一些环境变量会无限制地增长。
- 问题 #3643:向 _testcapi 添加了一些额外的检查,以防止因参数检查不严格而导致段错误。
- bsddb 代码更新到版本 4.7.3pre2。此代码与 Python 2.6 代码相同,因为目的是保持统一的 2.x/3.x 代码库。Python 代码使用“2to3”自动翻译。请勿手动更新 Python 3.0 中的此代码。更新 2.6 版本,然后执行“2to3”。
- _bytesio 和 _stringio 模块现在编译到 python 二进制文件中。
- 问题 #3492 和 #3790:修复了 zlib 模块和 zipimport 模块使用了可变的 bytearray 对象,而它们应该使用不可变的 bytes 对象。
- 问题 #3797:修复了 dbm、marshal、mmap、ossaudiodev 和 winreg 模块,使其返回 bytes 对象而不是 bytearray 对象。
工具/演示
- 修复 Misc/gdbinit 以使其工作。
构建
- 问题 #3812:如果 configure --without-threads,则无法构建 python。
- 问题 #3791:从 Windows 安装程序中移除 bsddb 模块,并从 Windows 构建文件中移除核心 bsddb 库。
Python 3.0b3 中的新特性?
发布日期:2008 年 8 月 20 日
核心和内置功能
问题 #3653:修复了当 sys.excepthook 被无效参数调用时发生的段错误。
问题 #2394:实现了更多的 memoryview API,但目前只支持并使用了 One-dimensional contiguous buffers。增加了切片、切片赋值和比较(相等和不等)。此外,toList() 方法已实现,但仅适用于字节缓冲区。最后,API 已更新,无论以前返回 bytearrays 的地方,现在都返回 bytes 对象。
问题 #3560:清理新的 C PyMemoryView API,使命名在内部保持一致;添加宏 PyMemoryView_GET_BASE() 和 PyMemoryView_GET_BUFFER() 以在不依赖特定实现的情况下访问内存视图的有用属性;移除命名不佳的 PyMemoryView() 函数(可以使用 PyMemoryView_GET_BUFFER() 代替)。
作为 COM 方法的 ctypes 函数指针再次具有布尔值 True。
问题 #1819:具有多个命名参数的函数调用平均快 35%(由 pybench 测量)。
未文档化的 C API PyUnicode_AsString() 和 PyUnicode_AsStringAndSize() 被设为解释器私有,以便能够为 Python 3.1 改进其接口。
如果需要以字节字符串访问 Unicode 对象的 UTF-8 表示,请改用 PyUnicode_AsUTF8String()。
问题 #3460:PyUnicode_Join() 实现速度提高了 10% 到 80%,这得益于 Python 3.0 更严格的语义,它允许避免结果字符串的连续重新分配(这也影响 str.join())。
库
- 问题 #1276:为 CJK Mac 编码添加了临时别名,以解决 MacOS 上 CJK 区域设置的构建问题。它为现有虚拟兼容 Mac 编码的传统编解码器添加了四个临时映射。它们将在 3.1 中被正确实现的编解码器取代。
- 问题 #3614:纠正了 xmlrpc.client 中的拼写错误,导致 NameError“全局名称'header'未定义”。
- 问题 #2834:更新正则表达式库以匹配 py3k 的 Unicode 标准。换句话说,混合字节和 Unicode 字符串(无论是作为模式、搜索字符串还是替换字符串)都会引发 TypeError。此外,re.UNICODE 标志会自动为 Unicode 模式启用,并且可以通过指定新的 re.ASCII 标志来禁用;对于字节模式,ASCII 匹配是唯一的选项,并且尝试为此类模式指定 re.UNICODE 会引发 ValueError。
- 问题 #3300:使 urllib.parse.[un]quote() 默认为 UTF-8。代码由 Matt Giuca 贡献。quote() 现在在引用前对输入进行编码,unquote() 在取消引用后进行解码。有新的参数可以更改编码和错误设置。还有新的 API 可以跳过编码/解码步骤。[un]quote_plus() 也受影响。
- 问题 #2235:numbers.Number 现在阻止基于默认 id() 的哈希的继承,因为该哈希机制不适用于数字类型。所有从 Number 继承(而不是仅仅注册到它)的具体数字类型都必须显式提供哈希实现,以便其实例可哈希。
- 问题 #2676:在 email 包中,内容类型解析因正则表达式的二次或指数行为而在病态输入上挂起。
- 问题 #3476:通过新的“io”库进行的二进制缓冲读取现在是线程安全的。
- 问题 #1342811:修复 Tkinter.Menu.delete 中的泄漏。与菜单条目关联的命令未删除。
- 从 tarfile.py 中删除 TarFileCompat 类。
- 问题 #2491:os.fdopen 现在几乎是内置 open() 的别名,并接受相同的参数。它只检查其第一个参数是否为整数。
- 问题 #3394:zipfile.writestr 在传递文件名而不是 ZipInfo 实例时设置外部属性,因此在 Unix 下,文件以模式 0600 而不是 000 提取。
- 问题 #2523:修复在不请求特定长度的情况下读取二进制文件时出现的二次行为。
扩展模块
- Bug #3542:支持 _msi 模块中的 Unicode 字符串。
Python 3.0b2 中的新特性?
发布日期:2008 年 7 月 17 日
核心和内置功能
- 问题 #3008:float 类型有一个新的实例方法“float.hex”和一个新的类方法“float.fromhex”,分别用于将浮点数转换为十六进制字符串以及从十六进制字符串转换浮点数。
- 问题 #3083:为 str.format() 添加 bin、oct、hex 输出的替代 (#) 格式。这分别添加了前缀 0b、0o 或 0x。
- 问题 #3280:与 chr() 一样,“%c”格式现在在所有配置上都接受超出基本多语言平面(高于 0xffff)的 Unicode 码点。在“窄 Unicode”构建中,结果是一个包含 2 个码元的字符串,形成一个 UTF-16 代理对。
- 问题 #3282:str.isprintable() 对于未定义的 Unicode 字符应返回 False。
- 问题 #3236:从 PyLong_FromString 返回小长整数。
- 异常回溯现在支持异常链。
库
- 移除了 sunaudio 模块。改用 sunau。
- 问题 #3554:ctypes.string_at 和 ctypes.wstring_at 在没有持有 GIL 的情况下调用 Python API 函数,这可能导致它们失败时出现致命错误。
- 问题 #799428:修复 Tkinter.Misc._nametowidget 以解包 Tcl 命令对象。
- 从解析器模块中移除了“ast”函数别名。
- 问题 #3313:修复了当失败的 dlopen() 调用未设置有效的 dlerror() 消息时发生的崩溃。
- 问题 #3258:修复了当创建指向不完整结构的 ctypes POINTER 类型时发生的崩溃。
- 问题 #2683:修复 subprocess.Popen.communicate() 中的不一致:现在参数在任何情况下都必须是字节对象。
- 问题 #3145:help("modules whatever") 在尝试加载标准库中每个模块的源代码时失败,包括测试套件中使用的无效文件。
- gettext 库现在始终使用 Unicode 字符串作为消息 ID 和消息字符串,并且ugettext()等已不复存在。
- traceback 模块已扩展以处理链式异常。
C API
- 问题 #3247:函数 Py_FindMethod 已被移除。现代类型应改用 tp_methods 槽。
工具/演示
- Mac/Demos 目录已被移除。
- 所有 Mac 脚本都已移除(包括 BuildApplet.py)。
Python 3.0b1 中的新特性?
发布日期:2008 年 6 月 18 日
核心和内置功能
- 问题 #3211:warnings.warn_explicit() 没有防止其“registry”参数是除 dict 或 None 之外的任何值。还修复了当“message”和“category”都设置为 None 时错误处理中的一个错误,该错误触发了总线错误。
- 问题 #3100:纠正了在解除分配持有其引用对象最后一个(强)引用的子类化弱引用时发生的崩溃。
- 问题 #2630:实现 PEP 3138。repr() 现在返回未转义的可打印 Unicode 字符,要获取对象的纯 ASCII 表示,请使用 ascii()。
- 问题 #1342:在 Windows 上,当 Python 安装在包含非 ASCII 字符的目录中时,无法启动。
- 实现 PEP 3121:新的模块初始化和终结 API。
- 移除了已经失效的-t选项。
- 问题 #2957:纠正了 ValueError“recursion limit exceeded”,当解组许多代码对象时,这发生在导入大型 .pyc 文件(约 1000 个函数)时。
- 问题 #2963:修复合并疏忽,该疏忽禁用了所有类型的方法缓存。
- 问题 #2964:修复 instancemethod_descr_get 中缺少的 INCREF。
- 问题 #2895:当给定字节对象作为关键字名称时,不要崩溃。
- 问题 #2798:当使用 PyArg_ParseTuple 解析参数时,“s”代码现在允许任何 Unicode 字符串并返回 UTF-8 编码的缓冲区,就像“s#”代码已经做的那样。“z”代码也得到了纠正。
- 问题 #2863:生成器现在具有gen.__name__属性,该属性等于gen.gi_code.co_name,就像func.__name___等于func.func_code.co_name。生成器的 repr() 现在也包含此名称。
- 问题 #2831:enumerate() 现在具有start参数。
- 问题 #2801:修复 float.is_integer 方法中的错误,该错误有时会错误地引发 ValueError。
- func_name--with-toolbox-glue选项(以及关联的 pymactoolbox.h)已被移除。
- 问题 #2196:hasattr() 现在允许不继承 Exception 的异常(KeyboardInterrupt 和 SystemExit)传播,而不是忽略它们。
- #3021 异常重新抛出语义已显著改进。但是,f_exc_type、f_exc_value 和 f_exc_traceback 不能再从 Python 代码中访问。
- PyNumberMethods 的三个成员:nb_coerce、nb_hex 和 nb_oct 已被移除。
扩展模块
- 将_winreg模块重命名为winreg.
- 如果平台上存在 os.O_ASYNC 和 fcntl.FASYNC 常量,则支持它们。
- winsound 模块中已移除对 Windows 9x 的支持。
- 问题 #2870:cmathmodule.c 编译错误。
库
- symtable.Symbol 的方法is_in_tuple(), is_vararg(),以及is_keywordarg()已移除。
- 补丁 #3133:http.server.CGIHTTPRequestHandler 在 Windows 上无法工作。
- 一个新的urllib包已创建。它由来自urllib, urllib2, urlparse,以及robotparser的代码组成。旧模块已全部移除。新包有五个子模块:urllib.parse, urllib.request, urllib.response, urllib.error,以及urllib.robotparser。该urllib.request.urlopen()函数使用来自urllib2url opener。(请注意,单元测试在 beta 版中尚未重命名,但将来会重命名。)
- rfc822 已被移除,转而使用 email 包。
- mimetools 已被移除,转而使用 email 包。
- 补丁 #2849:从标准库中移除 rfc822 模块的使用。
- 添加了 io.StringIO 的 C 优化实现。
- func_namepickle模块现在会在可用时自动使用 Pickler 和 Unpickler 的优化 C 实现。cPickle模块不再需要。
- 移除了htmllib和sgmllib模块。
- 已废弃的SmartCookie和SimpleCookie类已从http.cookies.
- func_namecommands模块已移除。其 getoutput() 和 getstatusoutput() 函数已移至subprocess模块。
- func_namehttp包已创建;它包含旧的httplib作为http.client, Cookie作为http.cookies, cookielib作为http.cookiejar,以及三个HTTPServer模块的内容作为http.server.
- func_namexmlrpc包已创建;它包含旧的xmlrpclib模块作为xmlrpc.client,以及旧的SimpleXMLRPCServer和DocXMLRPCServer模块的内容作为xmlrpc.server.
- func_namedbm包已创建,包含旧模块anydbm和whichdb在其__init__.py中,并具有dbm.gnu(以前是gdbm), dbm.bsd(以前是dbhash), dbm.ndbm(以前是dbm)和dbm.dumb(以前是dumbdbm)作为子模块。
- func_namerepr模块已重命名为reprlib.
- func_namestatvfs模块已移除。
- 问题 #1713041:修复 pprint 对最大深度的处理。
- 问题 #2250:在 rlcompleter 的Completer.complete()方法中评估名称时引发的异常现在被捕获并忽略。
- 补丁 #2659:为 textwrap 的TextWrapper类添加了break_on_hyphens选项。
- 问题 #2487:更改 math.ldexp(x, n) 的语义,当 n 太大以至于无法容纳在 C long 中时。如果 n 很大且为负,ldexp(x, n) 现在返回零(带适当的符号);以前,它会引发 OverflowError。
- func_nameConfigParser模块已重命名为configparser.
- 问题 #2865:webbrowser.open() 在 KDE 环境中再次工作。
- func_namemultifile模块已移除。
- func_nameSocketServer模块已重命名为socketserver.
- 修复了__all__在collections上的设置,以包含UserList和UserString.
- sre 模块已被移除。
- Queue 模块已重命名为 queue。
- copy_reg 模块已重命名为 copyreg。
- mhlib 模块已被移除。
- ihooks 模块已被移除。
- fpformat 模块已被移除。
- dircache 模块已被移除。
- Canvas 模块已被移除。
- Decimal 模块获得了魔术方法 __round__、__ceil__、__floor__ 和 __trunc__,以支持 round、math.ceil、math.floor 和 math.trunc。
- user 模块已被移除。
- mutex 模块已被移除。
- imputil 模块已被移除。
- os.path.walk 已被移除,转而使用 os.walk。
- pdb 获得了“until”命令。
- test.test_support 模块已重命名为 test.support。
- threading 模块 API 已重命名以符合 PEP 8。旧名称仍然存在,但将在不久的将来移除。
工具/演示
- bgen 工具已被移除。
构建
Python 3.0a5 中的新特性?
发布日期:2008 年 5 月 8 日
核心和内置功能
- 修复了在 sizeof(size_t) > sizeof(long) 的系统上 PyLong_FromSsize_t 的错误行为。
- 问题 #2221:纠正了 SystemError“error return without exception set”,当 exec() 执行的代码引发异常且 sys.stdout.flush() 也引发错误时。
- Bug #2565:类型对象的 repr() 现在将其称为“class”,而不是“type”——无论它们是否是内置类型。
- 命令行处理已转换为尽可能不修改地传递 Unicode 字符串;因此,与命令行参数相关的 C API 已更改为使用 wchar_t。
- 原始字符串中的所有反斜杠都被字面解释。这意味着“u”和“U”转义不会被特殊处理。
扩展模块
库
- ctypes 对象现在支持 PEP3118 缓冲区接口。
- 问题 #2682:ctypes 回调函数不再包含对自身的循环引用。
- 问题 #2058:移除 TarInfo 类中的 buf 属性并添加 __slots__,以减少 tarfile 的内存使用。
- Bug #2606:避免对 dict_keys 对象调用 .sort()。
- 捆绑的 libffi 副本现在与最近发布的 libffi3.0.5 版本同步,除了 Modules/_ctypes/libffi/configure.ac 中的一些小更改。
构建
- 问题 #1496032:在 alpha 上,当 gcc 是编译器时使用 -mieee。
- “make install”现在是“make altinstall”的别名,以防止意外覆盖 Python 2.x 安装。使用“make fullinstall”强制将 Python 3.0 安装为“python”。
- 问题 #2544:在 HP-UX 系统上,当 gcc 用作编译器时,链接时使用“gcc -shared”。
Python 3.0a4 中的新特性?
发布日期:2008 年 4 月 2 日
核心和内置功能
- Bug #2301:不要尝试将源代码解码回原始编码以获取语法错误。
扩展模块
- dl 模块已移除,请改用 ctypes 模块。
- 在 _locale 模块中使用 wchar_t 函数。
库
- 类 distutils.commands.build_py.build_py_2to3 可以用作 build_py 的替代品,以自动对将要安装的模块运行 2to3。
- 添加了新的 pickle 协议(协议 3),明确支持字节。这是默认协议。它有意不能被 Python 2.x 解封。
- 当 Python 2.x 写入的 pickle 包含一个 (8 位) str 实例时,现在会将其解码为 (Unicode) str 实例。用于执行此操作的编码默认为 ASCII,但可以通过 Unpickler 类的两个新关键字参数进行覆盖。以前这会创建字节实例,这通常是错误的:str 实例通常用于封存属性名称等,而且文本比二进制数据更常见。
- 如果 POSIX 系统不支持 CODESET 并且 LANG 未设置或不允许推断编码,则默认使用 ASCII 作为 locale.getpreferredencoding。
- 问题 #1202:zlib.crc32 和 zlib.adler32 现在返回一个无符号值。
- 问题 #719888:更新 tokenize 以使用字节 API。generate_tokens 已重命名为 tokenize,现在使用字节而不是字符串。添加了一个新的 detect_encoding 函数,用于根据 PEP-0263 确定源文件编码。tokenize 返回的令牌序列始终以指定用于解码文件的编码的 ENCODING 令牌开头。此令牌用于将 untokenize 的输出编码回字节。
Python 3.0a3 中的新特性?
发布日期:2008 年 2 月 29 日
核心和内置功能
- 问题 #2282:io.TextIOWrapper 未覆盖 io.IOBase 的 seekable()。
- 问题 #2115:设置 __slot__ 属性时显著提速。同时避免了可能发生的崩溃:抽象基类(Abstract Base Class)会尝试访问已注册虚拟子类上的槽位。
- 修复了复数在实部或虚部为无穷大或 NaN 时的 repr() 和 str()。
- 在最高代 gc.collect() 期间清空所有自由列表,以允许 pymalloc 释放更多内存区域。Python 可能会更早地将内存返还给操作系统。
- 问题 #2045:修复了当 collections.defaultdict 的子类在打印时,如果其 default_factory 设置为绑定方法,会触发无限递归的问题。
- 修复了 dictobject.c 中的一个轻微内存泄漏。解释器关闭时,自由列表的内容未被释放。
- 将方法和内置函数对象的自由列表限制为每个 256 个条目。
- 补丁 #1953:添加了sys._compact_freelists()以及 C API 函数PyInt_CompactFreeList和PyFloat_CompactFreeList用于压缩预分配整数和浮点数的内部自由列表。
- Bug #1983:修复了 fork()、fork1() 和 forkpty() 调用的返回类型。Python 期望返回类型为 int,但 fork 家族返回 pi_t。
- 问题 #1678380:修复了当 0j 和 -0j 出现在同一个代码单元时,它们被识别为相同的 bug。
- 问题 #2025:添加了 tuple.count() 和 tuple.index() 方法以符合 collections.Sequence API。
- 修复了 Python 解释器的多次重新初始化。longobject.c 中的小整数列表在第三次终结时导致了段错误。
- 问题 #1973:bytes.fromhex('') 抛出 SystemError。
- 问题 #1771:从 sorted() 和 list.sort() 中移除了 cmp 参数。
- 问题 #1969:bytearray 中的 split 和 rsplit 不一致。
- map() 不再接受 None 作为第一个参数。请改用 zip()。
- 问题 #1769:现在不允许 int("- 1")。
- Object/longobject.c:long(float('nan')) 抛出 OverflowError 而不是返回 0。
- 问题 #1762972:如果 .py 文件存在,__file__ 指向源文件而不是 .pyc/.pyo 文件。
- 问题 #1393:如果对象不相等,object_richcompare() 返回 NotImplemented 而不是 False,以便给另一方一个机会。
- 问题 #1692:解释器未显示 SyntaxError 的位置。
- 改进了 Windows 加载扩展模块失败时的一些异常消息。现在例如,我们得到“%1 不是有效的 Win32 应用程序”而不是“错误代码 193”。还使用 Unicode 字符串来处理非英语区域设置。
- 问题 #1587:为 PyCFunctions 添加了 instancemethod 包装器。Python C API 获得了新的类型 PyInstanceMethod_Type 以及函数 PyInstanceMethod_Check(o)、PyInstanceMethod_New(func) 和 PyInstanceMethod_Function(im)。
- 常量 gc.DEBUG_OBJECT 和 gc.DEBUG_INSTANCE 已从 gc 模块中移除;gc.DEBUG_COLLECTABLE 或 gc.DEBUG_UNCOLLECTABLE 现在足以打印垃圾回收器考虑的相应对象列表。
- 问题 #1573:不当使用仅限关键字语法导致解析器崩溃。
- 问题 #1564:set 的实现应该特殊处理 PyUnicode 而不是 PyString。
- 补丁 #1031213:将 SyntaxErrors 中的源行解码回其原始源编码。
- inspect.getsource() 再次包含装饰器。
- Bug #1713:posixpath.ismount() 错误地声称指向挂载点的符号链接是挂载点。
- 修复了 utf-8-sig 增量解码器,当第一个提供给解码器的块以 BOM 开头但长度超过 3 字节时,它无法识别 BOM。
扩展模块
- itertools 中的 ifilter()、imap() 和 izip() 的代码已移至 builtins 并重命名为 filter()、map() 和 zip()。此外,izip_longest() 重命名为 zip_longest(),ifilterfalse() 重命名为 filterfalse()。
- 问题 #1762972:重新添加了 reload() 函数,现在是 imp.reload()。
- Bug #2111:尝试写入以 PROT_READ 打开的块时,mmap 发生段错误。
- 问题 #2063:修复了 Windows 上 os.times() 结果中 utime 和 stime 的正确顺序。
库
- 弱引用字典现在继承自 MutableMapping。
- 在 collections 模块中创建了新的 UserDict 类。它继承自并符合 MutableMapping ABC。此外,将 UserString 和 UserList 移至 collections 模块。MutableUserString 类已移除。
- 移除了 UserDict.DictMixin。将其所有用途替换为 collections.MutableMapping。
- 问题 #1703:getpass() 写入提示后应该刷新。
- 问题 #1585:IDLE 使用不存在的 xrange() 函数。
- 问题 #1578:win_getpass 中的问题。
构建
- 将 --enable-unicode 配置标志重命名为 --with-wide-unicode,因为 Unicode 字符串无法再禁用。
C API
- 问题 #1629:将 Py_Size、Py_Type 和 Py_Refcnt 重命名为 Py_SIZE、Py_TYPE 和 Py_REFCNT。
- 新的 API PyImport_ImportModuleNoBlock(),其工作方式类似于 PyImport_ImportModule(),但不会在导入锁上阻塞(而是返回错误)。
Python 3.0a2 的新特性?
发布日期:2007 年 12 月 7 日
(注意:此列表不完整。)
核心和内置功能
- str8 现在具有与 bytes 相同的构造签名。
- str 和 str8 之间的比较现在对于 ==/!= 返回 False/True。sqlite3 在从其 __conform__ 值重新创建对象时返回 str8。struct 模块对于所有与字符串相关的格式都返回 str8。这在此更改之前是正确的,但由于字符串比较始终为 False,因此变得更加明显。
- 将 PyFile_FromFile() 替换为 PyFile_FromFd(fd, name. mode, buffer, encoding, newline)。
- 修复了 imp.find_module() 以遵守 -- coding: -- 头部。
- 将 __file__ 和 co_filename 更改为 unicode。路径名使用 Py_FileSystemDefaultEncoding 解码,并添加了新的 API 方法 PyUnicode_DecodeFSDefault(char*)。
- io.open() 和 _fileio.FileIO 增加了一个新参数 closefd。值为 false 时禁用文件描述符的关闭。
- 添加了一个新选项 -b 用于发出关于字节/缓冲区和字符串之间某些操作(如 str(b'') 和比较)的警告(-bb 用于错误)。
- 当 C 运行时库为流返回无效文件描述符时(fileno(stdin) < 0),标准流 sys.stdin、stdout 和 stderr 可能为 None。目前这只发生在 Windows GUI 应用程序和使用 pythonw.exe 启动的脚本中。
- 添加了用于 VS 2008 的 PCbuild9 目录。
- 将 structmember.h 中的 WRITE_RESTRICTED 重命名为 PY_WRITE_RESTRICTED,以解决 Windows 上与 VS 2008 的名称冲突。
- 未绑定方法彻底消失。ClassObject.method 返回一个普通的函数对象,instance.method 仍然返回一个绑定方法对象。绑定方法的 API 也得到了清理。im_class 属性被移除,im_func + im_self 被重命名为 __func__ 和 __self__。工厂 PyMethod_New 只接受 func 和 instance 作为参数。
- intobject.h 不再被 Python.h 包含。剩余部分已移至 longobject.h。它仍然存在以定义从 PyInt 到 PyLong 函数的几个别名。
- 移除了 sys.maxint,请改用 sys.maxsize。
扩展模块
- 移除了 hotshot 分析器;请改用 cProfile。
库
- 当使用 testfile() 加载外部文件时,如果定义了 __loader__ 并强制源为 UTF-8,则传入的编码参数会被忽略。
- 方法 os.tmpnam()、os.tempnam() 和 os.tmpfile() 已被移除,推荐使用 tempfile 模块。
- 移除了 'new' 模块。
- 从 'types' 模块中移除了所有可以通过内置函数轻松访问的类型。
Python 3.0a1 的新特性?
发布日期:2007 年 8 月 31 日
核心和内置功能
PEP 3131:支持非 ASCII 标识符。
PEP 3120:将默认编码更改为 UTF-8。
PEP 3123:为 PyObject 使用正确的 C 继承。
移除了 __oct__ 和 __hex__ 特殊方法,并添加了 bin() 内置函数。
PEP 3127:八进制字面量现在以 "0o" 开头。旧式八进制字面量无效。现在有以 "0b" 为前缀的二进制字面量。这也影响 int(x, 0)。
None、True、False 现在是关键字。
PEP 3119:isinstance() 和 issubclass() 可以被重写。
移除 BaseException.message。
移除元组参数解包 (PEP 3113)。
从帧中移除 f_restricted 属性。这自然导致 PyEval_GetRestricted() 和 PyFrame_IsRestricted() 的移除。
PEP 3132 被接受。这意味着你可以执行a, *b = range(5)将 0 赋值给 a,将 [1, 2, 3, 4] 赋值给 b。
range() 现在返回一个迭代器而不是一个列表。不允许浮点数。xrange() 不再定义。
补丁 #1660500:在列表推导中隐藏迭代变量,添加集合推导,并使用通用代码处理迭代表达式的编译。
默认情况下,!= 返回 == 的相反结果,除非后者返回 NotImplemented。
补丁 #1680961:sys.exitfunc 已被移除,并由私有的 C 级别 API 替换。
PEP 3115:新的元类:元类现在在类语句中指定为关键字参数,类语句现在可以使用参数列表的完整语法。此外,元类可以实现一个 __prepare__ 函数,该函数将被调用以创建新类命名空间的字典。
PyFloat_FromString() 中长期弃用的参数 "pend" 已被移除。
dir() 函数已扩展为在其参数上调用 __dir__() 方法(如果存在)。如果不存在,它将像以前一样工作。这允许在存在 __getattr__() 的情况下自定义 dir() 的输出。
移除了对 __members__ 和 __methods__ 的支持。
移除了 BaseException 上的索引/切片。
input() 变为 raw_input():input() 现在实现了以前称为 raw_input() 的功能;raw_input() 不再定义。
'except' 子句中列出的类必须继承自 BaseException。
PEP 3106:dict.iterkeys()、.iteritems()、.itervalues() 现已消失;.keys()、.items()、.values() 返回字典视图,其行为类似于集合。
PEP 3105:print 现在是一个函数。此外(不在 PEP 中),文件的 'softspace' 属性现已消失(因为 print() 不使用它)。此更改的一个副作用是您可能会在交互式会话中获得不完整的输出行。
>>> print(42, end="") 42>>>
我们可能能够在 I/O 库重写后修复此问题。
PEP 3102:仅限关键字参数。
Int/Long 统一已完成。内置类型 'long' 和带有后缀 'L' 或 'l' 的字面量已移除。性能可能不理想(尚未真正进行基准测试)。
'except E, V' 现在必须写成 'except E as V',并在 except 子句末尾删除 V;V 必须是简单名称。
根据 PEP 3107 添加了函数注解。
从 PEP 3104 添加了 nonlocal 声明。
>>> def f(x): ... def inc(): ... nonlocal x ... x += 1 ... return x ... return inc ... >>> inc = f(0) >>> inc() 1 >>> inc() 2
将 intern() 移至 sys.intern()。
exec 现在是一个函数。
将 nb_nonzero 重命名为 nb_bool,将 __nonzero__ 重命名为 __bool__。
经典类已成为过去。所有类都是新式类。
异常 必须 派生自 BaseException。
整数除法总是返回浮点数。-Q 选项不再存在。以下所有内容都已消失:
- PyNumber_Divide 和 PyNumber_InPlaceDivide
- __div__、__rdiv__ 和 __idiv__
- nb_divide、nb_inplace_divide
- operator.div、operator.idiv、operator.__div__、operator.__idiv__ (只剩下 __truediv__ 和 __floordiv__,不确定如果我们要重用 __div__ 和类似函数如何处理它们。如果这样做,将使编写同时适用于 2.x 和 3.x 的代码变得更加困难。)
'as' 和 'with' 是关键字。
绝对导入是 'import foo' 等的默认行为。
移除了对以下语法的支持:反引号(即 x),<>。
移除了这些 Python 内置函数:apply()、callable()、coerce()、execfile()、file()、reduce()、reload()。
移除了这些 Python 方法:{}.has_key。
移除了这些操作码:BINARY_DIVIDE、INPLACE_DIVIDE、UNARY_CONVERT。
移除了对受限执行的 C API 支持。
zip()、map() 和 filter() 现在返回迭代器,行为类似于它们的 itertools 对应项。这也影响 map() 在不等长序列上的行为——它现在在最短序列耗尽后停止。
新增:集合字面量、集合推导、省略号字面量。
根据 PEP 3129 添加了类装饰器。
扩展模块
- 移除了 imageop 模块。随着 rgbimg 和 imgfile 的移除,其单元测试变得无用,因此它也过时了。
- 从 operator 模块中移除了这些属性:div、idiv、__div__、__idiv__、isCallable、sequenceIncludes。
- 从 sys 模块中移除了这些属性:exc_clear()、exc_type、exc_value、exc_traceback。
库
- 移除了 compiler 包。改用 _ast 模块和(最终的)AST -> 字节码机制。
- 移除了这些模块:audiodev、Bastion、bsddb185、exceptions、linuxaudiodev、md5、MimeWriter、mimify、popen2、rexec、sets、sha、stringold、strop、sunaudiodev、timing、xmllib。
- 将 toaiff 模块移至 Tools/Demos。
- 移除了过时的 IRIX 模块:al/AL、cd/CD、cddb、cdplayer、cl/CL、DEVICE、ERRNO、FILE、fl/FL、flp、fm、GET、gl/GL、GLWS、IN、imgfile、IOCTL、jpeg、panel、panelparser、readcd、sgi、sv/SV、torgb、WAIT。
- 移除了过时的函数:commands.getstatus()、os.popen*()。
- 移除了 string 模块中也是字符串方法的函数;移除了 string.{letters, lowercase, uppercase}。
- 移除了对长期过时平台的支持:plat-aix3、plat-irix5。
- 移除了 xmlrpclib.SlowParser。它基于 xmllib。
- 补丁 #1680961:atexit 已用 C 重新实现。
- 为 UTF-32、UTF-32-LE 和 UTF-32-BE 添加了新的编解码器。
构建
C API
- 移除了这些 Python 槽位:__coerce__、__div__、__idiv__、__rdiv__。
- 移除了这些 C API:PyNumber_Coerce()、PyNumber_CoerceEx()、PyMember_Get、PyMember_Set。
- 移除了这些 C 槽位/字段:nb_divide、nb_inplace_divide。
- 移除了这些宏:staticforward、statichere、PyArg_GetInt、PyArg_NoArgs、_PyObject_Del。
- 移除了这些 typedef:intargfunc、intintargfunc、intobjargproc、intintobjargproc、getreadbufferproc、getwritebufferproc、getsegcountproc、getcharbufferproc、memberlist。
测试
- 移除了 test.testall,因为它已被 test.regrtest 替换。
文档
Mac
- cfmfile 模块已移除。
平台
- 根据 PEP 11,移除了对 BeOS 和 AtheOS 的支持。
- 移除了对 RiscOS、Irix、Tru64 的支持(据称)。
工具/演示
(有关旧版本的信息,请查阅 HISTORY 文件。)