Python 3.9 使用于基于 PEG 的新解析器替代 LL(1)。新解析器的性能与旧解析器大致相当,但 PEG 在设
计新语言特性时的形式化比 LL(1) 更灵活。我们将在 Python 3.10 及之后版本中开始使用这种灵活性。
ast 模块会使用新解析器并会生成与旧解析器一致的 AST。 在 Python 3.10 中,旧解析器将被移除,依赖于它的所有功能也将被移除(主要是 parser 模块,它早已被弃
用)。只有在 Python 3.9 中,你可以使用命令行开关 (-X oldparser) 或环境变量 (PYTHONOLDPARSER=1)
切换回 LL(1) 解析器。
• __import__() 现在会引发 ImportError 而不是 ValueError,后者曾经会在相对导入超出其
最高层级包时发生。(由 Ngalim Siregar 在 bpo-37444 中贡献。)
• Python 现在会获取命令行中指定的脚本文件名 (例如: python3 script.py) 的绝对路径:
__main__ 模块的 __file__ 属性将是一个绝对路径,而不是相对路径。现在此路径在当前
目录通过 os.chdir() 被改变后仍将保持有效。作为附带效果,回溯信息也将在此情况下为
__main__ 模块帧显示绝对路径。(由 Victor Stinner 在 bpo-20443 中贡献。)
• 在 Python 开发模式以及调试编译版本中,现在会针对字符串编码和解码操作检查 encoding 和 errors
参数。例如: open(), str.encode() 和 bytes.decode()。
默认设置下,为保证性能,errors 参数只会在第一次发生编码/解码错误时被检查,并且对于空字符
串 encoding 参数有时会被忽略。(由 Victor Stinner 在 bpo-37388 中贡献。)
• "".replace("", s, n) 对于所有非零的 n 都将返回 s 而不是空字符串。现在此方法会与
"".replace("", s) 保持一致。对于 bytes 和 bytearray 对象也有类似的修改。(由 Serhiy
Storchaka 在 bpo-28029 中贡献。)
• 任何有效的表达式现在都可被用作 decorator。在之前版本中,相关语法则更为严格。请参阅 PEP
614 了解详情。(由 Brandt Bucher 在 bpo-39702 中贡献。)
• 改进了 typing 模块的帮助信息。现在将为所有特殊形式和特殊通用别名 (例如 Union 和 List)
显示文档字符串。使用 help() 时传入通用别名例如 List[int] 将显示对应实体类型 (这里对应
的是 list) 的帮助信息。(由 Serhiy Storchaka 在 bpo-40257 中贡献。)
• aclose() / asend() / athrow() 的并行运行现在已被禁止,且 ag_running 现在会反映异步
生成器的实际运行状态。(由 Yury Selivanov 在 bpo-30773 中贡献。)
• 调用 __iter__ 方法时发生的非预期错误不会再被 in 运算符以及 operator 的 contains(),
indexOf() 和 countOf() 中的 TypeError 所掩盖。(由 Serhiy Storchaka 在 bpo-40824 中贡献。)


雷达卡



京公网安备 11010802022788号







