Python 1.5 及更高版本的新特性
如果您下载了源代码发行版,那么在 Misc/NEWS 文件中,自从 1.4 版本以来,有一长串的更改列表。下面是一些亮点。(或者直接跳转到 1.5b1 中的新特性、1.5b2 中的新特性和1.5(最终版)中的新特性的列表。)
- 有关元编程(一个难题!)主题的文章,请参阅我的文章Python 1.5 中的元编程。
- 另请参阅版本 1.5 中一些主要新特性的描述:内置包支持和标准异常类。
从 1.5 到 1.5.1 - 亮点
- 文档现在是分离的——从文档页面下载。
- 新的 python-mode.el(Emacs/Xemacs 编辑模式)。
- 打印递归字典和列表不再导致核心转储。
- 不带参数的 raise 语句会重新引发当前函数中引发的最后一个异常。
- import 语句现在在不同线程之间进行序列化。
- 最终化顺序更加合理。
- 在 Mac 和 Windows 上,模块文件名称的大小写必须与 import 语句中使用的大小写匹配。(当然,在 Unix 上,情况始终如此。)
- 当您指定 -t 选项时,tokenizer 会警告空格和制表符的不一致混合。两个 -t 选项会导致语法错误。另请参阅 Tools/scripts/tabnanny.py。所有库模块都是无警告的。
- freeze 工具现在支持分层模块名称。
- 新的标准模块:threading、getpass、imaplib、poplib、smtplib、Tkdnd (Tkinter 拖放)。
- 一些在很久以前就被声明为过时的模块已经从标准库路径中移出。
从 1.4 到 1.5 - 亮点
- 它快得多(Lib/test/pystone.py 基准测试几乎快了两倍。)
- 现在有一个 assert 语句assert <condition>或assert <condition>, <errormessage>。如果条件评估为 false,则引发 AssertionError。默认错误消息为空;断言语句的源代码文本作为回溯的一部分打印。
- 现在内置支持导入分层模块名称(例如“import spam.ham.eggs”);ni 被声明为过时。请注意,内置包支持稍微简单一些(没有 __ 和 __domain__),并且在一个关键方面有所不同:__init__.py 是必需的,并且加载到包的命名空间中,而不是作为子模块。有关更多信息,请参阅内置包支持。
- 新的“re”模块(Perl 风格的正则表达式)在这里。它基于 Philip Hazel 的 pcre 代码;Python 接口由 Andrew Kuchling 组装。regex 模块被声明为过时。
- 为了支持 re 模块,引入了一种新的字符串文字形式,“原始字符串”:例如,r"n" 等于 "\n"。
- 所有标准异常和大多数在标准扩展模块中定义的异常现在都是类。使用 python -X 恢复为字符串异常。有关更多信息,请参阅标准异常类。
- 比较现在可以引发异常(以前,比较期间发生的异常会被忽略)。
- 新的字典方法:.clear()、.copy()、.update()、.get()。前两个很明显;d1.update(d2) 等效于 for 循环for k in d2.keys(): d1[k] = d2[k]; 如果 d[k] 存在,d.get(k) 返回 d[k],否则返回 None(或可选的第二个参数)。
- 有一个新的回归测试工具,它可以测试更多的模块。(要运行测试,请执行“import test.autotest”。)
- 解释器对于 sys.path 的初始值更加智能;您可以使用 $PYTHONHOME 更轻松地控制它(请参阅用法消息,例如尝试python -h)。在大多数情况下,解释器可以安装在任意位置,而无需重新编译。
- 构建过程现在构建一个单独的库 (libpython1.5.a),其中包含除 main() 入口点之外的所有内容。这使得嵌入 Python 的应用程序的生活更加轻松。
- 对嵌入的支持更好,包括线程、多个解释器 (!)、取消初始化以及访问全局解释器锁。
- 有一个 -O 选项可以删除 SET_LINENO 指令、assert 语句和以以下代码为前缀的代码if __debug__: ...。(它仍然只产生几个百分点的差异,所以不要太激动。)
- 大重命名已完成:Python 定义的所有链接器可见符号现在都带有“Py”或“_Py”前缀,大多数宏和 typedef 也是如此。
从 1.5a4 到 1.5b1
如果您是 alpha 测试人员,以下是自 1.5a4 以来最相关的更改(当然,所有已知的错误都已修复,泄漏已堵塞,并且添加了一些文档)。自 1.5a4 以来的完整更改列表在 Misc/NEWS 文件的末尾给出。
- 包目录现在需要存在 __init__.py(或适用的 .pyc/.pyo)。包现在可以包含共享库模块。
- 新模块“fileinput”用于迭代文件列表的行。
- 新模块“locale”用于本地化的数字格式和字符串大小写敏感度。
- 新模块“xmllib”用于解析 XML 文件。
- 更多对 Tk 扩展(PIL、TIX、BLT、TOGL)的支持。
- 修复了模块“rfc822”中的地址列表解析。
- 更多针对“re”模块的部署(只有一个修复)。
- Emacs 的新 Python 模式。
- OS/2 支持。
从 1.5b1 到 1.5b2
- 感谢所有为库模块贡献文档字符串的人!
- 由缩进的预处理器命令和 C++ 风格的注释引起的移植性问题现在应该已经消失了。
- 再次对 python-mode.el 进行了大量改进。
- pickle.py 和 cPickle.c 中的更改:当 unpickling 一个未定义 __getinitargs__() 方法的类的实例时,不再调用 __init__() 构造函数。这使得默认情况下可以 pickle 更大的一组类,但有时可能会更改语义。要强制在 unpickling 时调用 __init__(),请定义一个 __getinitargs__() 方法。其他更改也是如此,特别是 cPickle 现在可以正确处理包中定义的类。同样的更改也适用于使用 copy.py 复制实例。
- “re”(Perl 正则表达式)模块中的区域设置支持。使用标志 re.L(或 re.LOCALE)为 w 和 b 启用特定于区域设置的匹配规则。此标志的内联语法为 (?L)。
- 当 y 是类型对象并且 type(x) 是 y 时,内置函数 isinstance(x, y) 现在也会成功。
- 类和实例对象的 repr() 和 str() 现在反映定义该类的包/模块。
- 模块“ni”已被删除。(如果您确实需要它,它已被重命名为“ni1”。如果这对您造成任何问题,请告诉我。鼓励包作者编写同时支持 ni 和 1.5 包支持的 __init__.py 文件,以便同一版本可以与 Python 1.4 和 1.5 一起使用。)
- 配置线程时,线程模块现在会自动包含。(您必须从现有的 Setup 文件中删除它,因为它现在位于自己的 Setup.thread 文件中。)
- 新的命令行选项“-x”用于跳过脚本的第一行;方便在非 Unix 平台上制作可执行脚本。
- 在 importdl.c 中,将 RTLD_GLOBAL 添加到 dlopen() 标志。我没有检查这会如何影响事情,但它应该使一个共享库中的符号可用于下一个共享库。
- Windows 配置添加了一个新的主程序“pythonw”,并注册了一个新的扩展名“.pyw”来调用它。这是一个标准的 Python 解释器,不会弹出控制台窗口;方便纯 Tkinter 应用程序。发送到原始 stdout 和 stderr 的所有输出都会丢失;从原始 stdin 读取会产生 EOF。
从 1.5b2 到 1.5(最终版)
- 感谢所有贡献文档字符串或其他文档的人!
- 文档的质量有了许多小的改进,包括 PostScript、HTML 甚至是 Emacs info(仅限库手册)。
- 新的模块 telnetlib.py。
- 新的工具 versioncheck。
- 修复了 urllib.py 中 ftp URL 的两个错误。
- 修复了打印 __builtins__ 时的无限递归。
- 在 Tkinter.py 中修复了一些小问题。
- 将 zlibmodule.c 和 bsddbmodule.c 移植到 NT。
- tempfile.py 中更好的 NT 支持。
- 修复了 4294967296==0。
- 最新的 re 和 pcre 模块(12 月 22 日的版本)。