Python 3.10的新功能

2021-02-17 18:15:03

发行前的用户应注意,该文档当前处于草稿形式。随着Python 3.10即将发布,该版本将进行实质性更新,因此即使在阅读了较早的版本后也应进行检查。

在Python 3.7中,添加了对注释的延迟评估,以使用from __future__ import注解指令启用。在3.10版中,即使没有该将来的指令,它也成为默认行为。默认情况下,存储在其中的所有注释都是字符串。如果需要,可以在运行时使用type.get_type_hints()解析注释。有关完整说明,请参见PEP 563。另外,inspect.signature()将从现在开始尝试解析类型,当失败时,它将退回到显示字符串注释。 (由Batuhan Taskayain bpo-38605提供。)

int类型具有新方法int.bit_count(),该方法返回给定整数的二进制扩展中的1的数量,也称为总体计数。 (由Niklas Fiekas在bpo-29882中贡献。)

dict.keys(),dict.values()和dict.items()返回的视图现在都具有一个映射属性,该属性提供一个type.MappingProxyType对象,该对象包装了原始字典。 (由Dennis Sweeney在bpo-40890中贡献。)

PEP 618:zip()函数现在具有一个可选的strict标志,用于要求所有可迭代对象具有相等的长度。

PEP 484引入了类型别名的概念,仅要求它们成为顶级的未注释分配。这种简单性有时使类型检查器很难区分类型别名和普通分配,尤其是在涉及前向引用或无效类型时。比较:

引入了一种新类型的联合运算符,它启用了语法X |。 Y。这提供了一种更简洁的表示“ X型或Y型”的方式,而不是使用输入。联合,尤其是在类型提示(注释)中。

在以前的Python版本中,要为接受多种类型参数的函数应用类型提示,请键入。

打字模块中添加了两个新选项,以改进为PEP 484的可调用项提供给静态类型检查器的信息。

第一个是参数规范变量。它们用于将一个可调用的参数类型转发给另一个可调用的参数-一种在高级函数和修饰符中常见的模式。使用示例可以在type.ParamSpec中找到。以前,没有一种简单的方法可以以这种精确的方式键入参数类型的注释依赖。

第二个选项是新的Concatenate运算符。它与参数规范变量一起使用,以注释高阶可调用项,该可调用项可添加或删除另一个可调用项的参数。可以在type.Concatenate中找到用法示例。

当解析包含未封闭括号或方括号的代码时,解释器将包括未封闭括号的位置,而不是显示SyntaxError:解析或指向某个不正确位置时出现意外的EOF。例如,请考虑以下代码(请注意未封闭的'{' ):

预期= {9:1、18:2、19:2、27:3、28:3、29:3、36:4、37:4、38:4、39:4、45:5、46:5 ,47:5,48:5,49:5,54:6,some_other_code = foo()

文件" example.py&#34 ;,第1行预计= {9:1、18:2、19:2、27:3、28:3、29:3、36:4、37:4,^语法错误:' {'从未关闭

以类似的方式,涉及未封闭的字符串文字(单引号和三引号)的错误现在指向字符串的开头,而不是报告EOF / EOL。

带有整数参数的内置函数和扩展函数不再接受只能有损失地转换为整数的小数,分数和其他对象(例如,具有__int __()方法但没有__index __()方法的对象)。(由Serhiy Storchaka提供)在bpo-37999中。)

赋值表达式现在可以在集合文字和集合理解以及序列索引中(但不能在切片中)使用无括号的形式使用。

argparse帮助中的误导性短语“可选参数”已替换为“选项”。如果某些测试依赖于精确的输出匹配,则可能需要进行调整。(由Raymond Hettinger在bpo-9694中提供。)

添加codecs.unregister()函数以注销编解码器搜索功能。(由Hai Shi在bpo-41842中贡献。)

现在,collections.abc.Callable的参数化泛型的__args__与type.Callable一致。现在,collections.abc.Callable泛型会展平类型参数,类似于type.Callable当前所做的。这意味着collections.abc.Callable [[int,str],str]的__args__为(int,str,str);以前是([int,str],str)。为了允许此更改,现在可以对type.GenericAlias进行子类化,并且在对collections.abc.Callable类型进行下标时将返回一个子类。请注意,对于参数化collections.abc.Callable的无效形式可能会引发TypeError,该形式可能已在Python 3.9中静默传递(由Ken Jin在bpo-42195中贡献)。

添加contextlib.aclosing()上下文管理器以安全地关闭代表异步释放资源的异步生成器和对象。(由Joongi Kim和John Belmonte在bpo-41229中贡献。)

curses.color_content(),curses.init_color(),curses.init_pair()和curses.pair_content()将透明地使用ncurses 6.1中添加的扩展颜色函数。一个新函数curses.has_extended_color_support()指示底层的ncurses库是否提供了扩展的颜色支持(由Jeffrey Kintscher和Hans Petter Jansson在bpo-36982中贡献。)

如果BUTTON5_ *常量由基础curses库提供,则它们现在在curses模块中公开。(由Zackery Spytz在bpo-39273中贡献)。

整个distutils软件包已弃用,将在Python3.12中删除。它指定软件包内部版本的功能已被第三方软件包setuptools和package完全取代,大多数其他常用的API在标准库的其他位置(如平台,shutil,子进程或sysconfig)可用。没有计划从distutils迁移任何其他功能,并且使用其他功能的应用程序应该计划制作该代码的私有副本。请参考PEP 632进行讨论。

已删除Python 3.8中不推荐使用的bdist_wininst命令。现在建议使用bdist_wheel命令在Windows上分发二进制软件包(由Victor Stinner在bpo-42802中提供)。

当模块未定义__loader__时,退回到__spec __。loader。(由Brett Cannon在bpo-42133中贡献。)

在glob()和iglob()中添加了root_dir和dir_fd参数,这些参数允许指定要搜索的根目录。(由Serhiy Storchaka在bpo-38144中贡献。)

当模块未定义__loader__时,退回到__spec __。loader。(由Brett Cannon在bpo-42133中贡献。)

在signature()和inspect.Signature.from_callable()中添加了globalns和localns参数,以检索给定的本地和全局名称空间中的注释。(由Batuhan Taskaya在bpo-41960中贡献。)

当模块未定义__loader__时,退回到__spec __。loader。(由Brett Cannon在bpo-42133中贡献。)

添加了新的函数os.eventfd()和相关帮助程序,用于在Linux上包装eventfd2系统调用。(由Christian Heimes在bpo-41001中贡献。)

添加了os.splice(),它允许在两个文件描述符之间移动数据,而无需在内核地址空间和用户地址空间之间进行复制,其中文件描述符之一必须引用管道。 (由Pablo Galindo在bpo-41625中贡献。)

添加了platform.freedesktop_os_release()以从freedesktop.org操作系统发行版标准文件中检索操作系统标识。(由Christian Heimes在bpo-28468中贡献)

在pyclbr.readline()和pyclbr.readline_ex()返回的树中的功能和类对象中添加了end_lineno属性。它与现有的(开始)行号匹配(由Aviral Srivastava在bpo-38307中贡献)

现在,搁板模块在创建货架时默认使用pickle.DEFAULT_PROTOCOL而不是pickle协议3。(由Zackery Spytz在bpo-34204中贡献。)

当模块未定义__loader__时,退回到__spec __。loader。(由Brett Cannon在bpo-42133中贡献。)

添加sys.orig_argv属性:传递给Python可执行文件的原始命令linearguments的列表。(由Victor Stinner在bpo-23427中贡献。)

添加sys.stdlib_module_names,其中包含标准库模块名称的列表。(由Victor Stinner在bpo-42955中贡献。)

添加了threading.gettrace()和threading.getprofile()来分别检索threading.settrace()和threading.setprofile()设置的功能。(由Mario Corchero在bpo-42251中贡献。)

添加threading .__ excepthook__以允许检索threading.excepthook()的原始值,以防它设置为残破值或其他值。(由Mario Corchero在bpo-42308中贡献。)

现在,format_exception(),format_exception_only()和print_exception()函数可以将异常对象作为仅位置参数(由back-26389的Zackery Spytz和Matthias Bussonnier贡献)。

重新引入了types.EllipsisType,types.NoneType和types.NotImplementedType类,从而提供了一组新的类型集,这些类型集可以由类型检查程序轻松解释。(由Bas van Beek在bpo-41810中贡献。)

type.Literal的行为已更改为符合PEP 586,并与PEP中指定的静态类型检查器的行为匹配。

文字比较现在尊重类型。例如,Literal [0] == Literal [False]先前计算为True。现在是错误的。为了支持此更改,内部使用的类型缓存现在支持区分类型。

如果文字对象的参数之一不是不变的,则文字对象现在将在相等比较期间引发TypeError异常。请注意,使用可变参数声明Literal不会引发错误:

>>>从输入import Literal>>文字[{0}]>>>文字[{0}] ==文字[{False}]追溯(最近一次调用最近):文件"< stdin>&#34 ;,< module>中的第1行TypeError:无法散列的类型:' set'

低于Python 3.10的Python版本允许同时使用;和& urllib.parse.parse_qs()和urllib.parse.parse_qsl()中的asquery参数分隔符。由于安全方面的考虑,并且为了符合最新的W3C建议,对此进行了更改,只允许使用&作为默认值。此更改还会影响cgi.parse()和cgi.parse_multipart(),因为它们在内部使用了受影响的功能。有关更多详细信息,请参阅其各自的文档。(由Adam Goldschmidt,Senthil Kumaran和Ken Jin在bpo-42967中贡献。)

向xml.sax.handler模​​块中添加一个LexicalHandler类。(由bona-35018中的Jonathan Gossage和Zackery Spytz提供)。

构造函数str(),bytes()和bytearray()现在更快(小型对象大约为30–40%)。(由Serhiy Storchaka在bpo-41334中贡献。)

现在,runpy模块导入的模块更少了。python3 -m module-name命令的启动时间平均缩短了1.3倍。(由Victor Stinner在bpo-41006中贡献。)

LOAD_ATTR指令现在使用新的“每个操作码缓存”机制。现在,常规属性的速度提高了约36%,插槽的速度提高了44%。(由Pablo Galindo和Yury Selivanov在bpo-42093中以及Guidovan Rossum在bpo-42927中提供,基于最初在PyPyand MicroPython中实现的思想。)

现在使用--enable-optimizations构建Python时-fno-semantic-interposition被添加到了编译和链接行中,这使使用--enable-shared与gcc创建的Python解释器的构建速度提高了30%。有关更多详细信息,请参见本文。 (由Victor Stinner和Pablo Galindo在bpo-38980中贡献。)

函数参数及其注释不再在运行时计算,而是在编译时计算。它们在字节码级别存储为字符串元组。现在,使用参数注释创建函数的速度提高了约100%。 (由Yurii Karabas和Inada Naoki在bpo-42202中贡献)

从此发行版开始,将齐心协力开始清理为Python 2.7兼容性保留的旧导入语义。具体来说,是find_loader()/ find_module()(由find_spec()取代),load_module()(由exec_module()取代),module_repr()(导入系统将为您处理),__package__属性(由__spec__取代)。父级),__ loader__属性(由__spec __。loader取代)和__cached__属性(由__spec __。cached取代)将被缓慢删除(以及importlib中的其他类和方法)。将适当地引发ImportWarning和/或DeprecationWarning,以帮助识别在此过渡期间需要更新的代码。

整个distutils名称空间已弃用,将在Python 3.12中删除。有关更多信息,请参阅模块更改部分。

不建议使用random.randrange()的非整数参数。不建议使用ValueError,而建议使用TypeError(由Serhiy Storchaka和Raymond Hettinger在bpo-37319中贡献)。

自Python 3.6起,importlib的各种load_module()方法已被记录为已弃用,但现在也会触发DeprecationWarning。请改用exec_module()。(由Brett Cannon在bpo-26131中贡献。)

现在,导入系统使用load_module()会触发ImportWarning,因为首选exec_module()(由Brett Cannon在bpo-26131中贡献。)

sqlite3.OptimizedUnicode自从Python3.3成为str的别名以来就没有记录且已过时。现在已弃用,计划在Python 3.12中将其删除。(由Erlend E. Aasland在bpo-42264中贡献。)

现在不推荐使用未公开的内置函数sqlite3.enable_shared_cache,计划在Python 3.12中将其删除。 SQLite3文档强烈建议不要使用它。有关更多详细信息,请参见SQLite3文档。如果必须使用共享缓存,请使用cache = shared查询参数以URI模式打开数据库(由Erlend E. Aasland在bpo-24464中贡献。)

删除了复杂类的特殊方法__int__,__float__,__floordiv__,__mod__,__divmod__,__rfloordiv__,__rmod__和__rdivmod__。他们总是引发TypeError。(由Serhiy Storchaka在bpo-41974中贡献。)

来自私有和未公开文档_markupbasemodule的ParserBase.error()方法已被删除。 html.parser.HTMLParser是ParserBase的唯一子类,其error()实现已在Python 3.5中删除。(由Berker Peksag在bpo-31844中贡献。)

删除了unicodedata.ucnhash_CAPI属性,该属性是一个internalPyCapsule对象。相关的_PyUnicode_Name_CAPI私有结构已移至内部C API。(由Victor Stinner在bpo-42157中贡献。)

删除了解析器模块,由于切换到新的PEG解析器,该解析器模块在3.9中已弃用,以及所有仅由旧解析器使用的C源文件和头文件,包括node.h,parser.h,graminit.h和grammar.h。

删除了由于切换到新的PEG分析器而在3.9中弃用的公共C API函数PyParser_SimpleParseStringFlags(),PyParser_SimpleParseStringFlagsFilename(),PyParser_SimpleParseFileFlags()和PyNode_Compile()。

删除了在Python 3.4中不推荐使用的格式化程序模块,该模块有些过时,很少使用且未经测试。它原本计划在Python 3.6中删除,但此类删除被推迟到Python 2.7 EOL之后。现有用户应将他们使用的任何类复制到代码中(由Dong-hee Na和Terry J. Reedy在bpo-42299中贡献。)

删除了由于_warnings模块在2.6中转换为内置模块而不再有用的PyModule_GetWarningsModule()函数。(由Hai Shi在bpo-42599中贡献。)

从collections模块中删除对Collections Abstract Base Classes不推荐使用的别名。(由Victor Stinner在bpo-37324中贡献。)

在Python 3.8中弃用后,loop参数已从大多数asyncio的高级API中删除。这种变化背后的动机是多重的:

自Python 3.7起,高级API中的函数就隐式获取了当前线程的运行事件循环。在大多数正常使用情况下,无需将事件循环传递给API。

请注意,低级API仍将接受循环。有关如何替换现有代码的示例,请参见Python API中的更改。

本节列出了先前描述的更改以及可能需要更改代码的其他错误修正。

追溯模块中的format_exception(),format_exception_only()和print_exception()函数的etype参数已重命名为exc。(由Zackery Spytz和Matthias Bussonnier在bpo-26389中贡献。)

atexit:在Python退出时,如果在atexit.register()中注册的回调失败,则现在将记录其异常。以前,仅记录一些异常,而最后一个异常总是被默默忽略。(由Victor Stinner在bpo-42639中贡献。)

现在,collections.abc.Callable泛型会展平类型参数,类似于type.Callable当前所做的。这意味着collections.abc.Callable [[int,str],str]的__args__为(int,str,str);以前是([int,str],str)。通过键入访问参数的代码.get_args()或__args__需要考虑此更改。此外,可能会因无效形式的参数化collections.abc.Callable引发TypeError,而该形式可能已在Python 3.9中无声地传递。(由Ken Jin在bpo-42195中贡献。)

如果给定参数不适合16位无符号整数,则socket.htons()和socket.ntohs()现在会引发OverflowError而不是DeprecationWarning。(由Erlend E. Aasland在bpo-42393中贡献。)

在Python 3.8中弃用后,loop参数已从大多数asyncio的高级API中删除。

如果foo()专为不在当前线程的运行事件循环中运行而设计(例如,在另一个线程的事件循环中运行),请考虑改用asyncio.run_coroutine_threadsafe()。

MAKE_FUNCTION指令接受字符串的元组作为注释而不是字典。(由Yurii Karabas和Inada Naoki在bpo-42202中贡献)

现在需要C99函数snprintf()和vsnprintf()来构建Python。(由Victor Stinner在bpo-36020中贡献。)

sqlite3需要SQLite 3.7.15或更高版本。 (由Sergey Fedoseevand Erlend E.Aasland bpo-40744和bpo-40810贡献。)

现在必须始终将atexit模块构建为内置模块。(由Victor Stinner在bpo-42639中贡献。)

在配置脚本中添加了--disable-test-modules选项:不要构建或安装测试模块。(由Xavier de Gaye,Thomas Petazzoni和Peixing Xin在bpo-27640中贡献。)

将--with-wheel-pkg-dir = PATH选项添加到./configure脚本中。如果指定,则surepip模块将在此目录中查找setuptools和pipwheel软件包:如果同时存在,则使用这些轮包而不是surepip捆绑的轮包。

一些Linux发行版打包策略建议避免捆绑依赖。 例如,Fedora将Wheel软件包安装在/ usr / share / python-wheels /目录中,而不安装surepip._bundled软件包。 PyNumber_Index()的结果现在始终具有精确的int类型。以前,该结果可能是int的子类的实例。(由Serhiy Storchaka在bpo-40中贡献 ......