uuid.UUID现在用于slots__减少其内存占用。 -性能提升operator.itemgetter()了33%。优化参数处理并为单个非负整数索引的常见情况添加快速路径到元组(这是标准库中的典型用例)。 -加速字段查找collections.namedtuple()。它们现在的速度提高了两倍以上,使它们成为Python中最快的实例变量查找形式。 -list如果输入iterable具有已知长度(输入实现__len),则构造函数不会全局定位内部项缓冲区。这使得创建的列表平均减少12%。(由Raymond Hettinger和Pablo Galindo在bpo-33234中提供。)
-将类变量写入的速度加倍。更新非dunder属性时,会有不必要的更新插槽调用。(由Stefan Behnel,Pablo Galindo Salgado,Raymond Hettinger,Neil Schemenauer和Serhiy Storchaka供稿于bpo-36012。)
-减少转换传递给许多内置函数和方法的参数的开销。加快调用一些简单的内置函数和方法,最多可达20-50%。(由Serhiy Storchaka在bpo-23867, bpo-35582和bpo-36127供稿。)
构建和C API更改
-
这些PyByteArray_Init()和PyByteArray_Fini()功能已被删除。他们没有做任何事情,因为Python 2.7.4和Python 3.2.0被排除在有限的API(稳定的ABI)之外,并且没有记录。
-
结果PyExceptionClass_Name()现在是类型 而不是。const char *char *
-
二元性Modules/Setup.dist 和 Modules/Setup 已被删除。以前,在更新CPython源代码树时,必须手动将Modules/Setup.dist(在源代码树内)复制到 Modules/Setup(在构建树内)以反映上游的任何更改。这对包装商来说是一个小小的好处,代价是CPython开发后开发人员经常烦恼,因为忘记复制文件可能会导致构建失败。
-
现在构建系统总是从Modules/Setup源树内部读取。鼓励想要自定义该文件的人将其更改保存在CPython的git fork中或作为补丁文件,就像它们对源树的任何其他更改一样。
-
将Python数转换为C整数的 PyLong_AsLong() 函数和参数解析函数(如 PyArg_ParseTuple()整数转换格式单位)'i' 现在将使用__index__() 特殊方法而不是( int__()如果可用)。将使用_int_()方法但没有 _index_()方法(如Decimal和 Fraction) 为对象发出弃用警告。 PyNumber_Check() 现在将返回 1实现的对象__index()。
-
堆分配的类型对象现在将增加它们PyObject_Init()(和它的并行宏PyObject_INIT)中的引用计数而不是in PyType_GenericAlloc()。可能需要调整修改实例分配或释放的类型。
不支持
-
不建议使用的方法getchildren() ,getiterator() 在ElementTree 模块现在发出 DeprecationWarning 来代替PendingDeprecationWarning 。它们将在Python 3.9中删除。
-
传递一个不是concurrent.futures.ThreadPoolExecutorto 的实例的对象已 asyncio.loop.set_default_executor() 被弃用,并且将在Python 3.9中被禁止。
-
该getitem() 方法xml.dom.pulldom.DOMEventStream , wsgiref.util.FileWrapper 并fileinput.FileInput已被弃用。
这些方法的实现忽略了它们的索引参数,而是返回下一个项目。
-
该typing.NamedTuple 已否决了,_field_types 赞成的属性__annotations __具有相同信息的属性。
ast类Num,Str,Bytes,NameConstant 和 Ellipsis 被标记是过时的,并将在未来的Python版本中删除。Constant应该用来代替。
-
下面的函数和方法弃用在gettext 模块:lgettext() ,ldgettext() , lngettext()和ldngettext()。它们返回编码的字节,如果翻译的字符串存在编码问题,则可能会出现意外的与Unicode相关的异常。在Python 3中使用返回Unicode字符串的替代方法要好得多。这些功能已经被打破了很长时间。
-
功能bind_textdomain_codeset() ,方法 output_charset() 和 set_output_charset() ,以及代码集 的功能参数translation() 和install() 也不赞成使用,因为它们仅用于为l*gettext()功能。
-该isAlive() 方法threading.Thread 已被弃用。
许多带有整数参数的内置函数和扩展函数现在将为Decimals,Fractions和任何其他对象发出弃用警告, 这些对象只能在丢失的情况下转换为整数(例如,具有int__() 方法但没有__index()方法)。在将来的版本中,它们将是错误的。
API和功能删除
从`Python 3.8`中删除了以下功能和API:
-
macpath 已删除在Python 3.7 中弃用的模块。
该函数platform.popen() 已被删除,自Python 3.3以来已被弃用:os.popen()改为使用。
-
该pyvenv脚本已被删除, 以帮助消除关于 脚本绑定的Python解释器的混淆。python3.8 -m venvpyvenv
-
parse_qs,parse_qsl 和escape 从除去cgi 模块。它们已从Python 3.2或更早版本弃用。
-
filemode 功能已从tarfile 模块中删除。自Python 3.3以来,它没有记录和弃用。
该XMLParser 构造不再接受HTML 参数。它从未产生过影响,在Python 3.4中已被弃用。所有其他参数现在都是仅关键字。
-
删除了doctype()方法XMLParser。
-
unicode_internal 编解码器被删除。
移植
本节列出了先前描述的更改以及可能需要更改代码的其他错误修正。
## Python行为的变化
|