Python 3.9移除了Python 2.7的向后兼容层

2020-09-24 02:46:25

预发行版用户应该知道,本文档目前正在起草中。随着Python3.9向发行版迈进,它将会有很大的更新,所以即使在阅读了早期版本之后,也值得回顾一下。

当Python2.7仍然被支持时,为了向后兼容Python2.7,保留了许多函数。随着Python2.7支持的结束,这些向后兼容层已经被移除,或者很快将被移除,它们中的大多数在几年内都发出了DeproationWarning警告。例如,从2012年发布的Python3.3开始,使用集合。映射而不是集合。abc.Mapping会发出DeproationWarning。

使用-W默认命令行选项测试您的应用程序以查看DeproationWarning和PendingDeproationWarning,甚至使用-W错误将它们视为错误。警告筛选器可用于忽略来自第三方代码的警告。

已经决定保留几个向后兼容层,以便让Python项目的维护人员有更多的时间来组织Python2支持的移除,并添加对Python3.9的支持。

集合模块中抽象基类的别名,就像集合。将别名映射到集合。abc.Mapping,为了向后兼容,在最后一个版本中保留。它们将从Python3.10中删除。

更一般地,尝试在Python开发模式下运行测试,这有助于准备代码,使其与下一个Python版本兼容。

添加了str.removeprefix(前缀)和str.removesuffix(后缀),以便从字符串中轻松删除不需要的前缀或后缀。还添加了相应的字节、字节数组和集合.UserString方法。有关完整说明,请参阅PEP 616。(丹尼斯·斯威尼在BPO-39939中贡献。)。

在类型批注中,您现在可以使用内置集合类型(如LIST和DICT)作为泛型类型,而不是从键入中导入相应的大写类型(如LIST或DICT)。标准库中的一些其他类型现在也是泛型的,例如queue.Queue。

有关更多详细信息,请参阅PEP 585。(由Guido van Rossum,Ethan Smith和Batuhan TaşKaya在BPO-39481中贡献。)。

Python3.9使用了一个基于PEG的新解析器,而不是LL(1)。新解析器的性能与旧解析器大致相当,但是在设计新的语言特性时,PEG形式比LL(1)更灵活。我们将在Python3.10及更高版本中开始使用这种灵活性。

AST模块使用新解析器并生成与旧解析器相同的AST。

在Python3.10中,旧的解析器将被删除,所有依赖于它的功能也将被删除(主要是解析器模块,它已被长期弃用)。仅在Python3.9中,可以使用命令行开关(-X oldparser)或环境变量(PYTHONOLDPARSER=1)切换回LL(1)解析器。

有关更多详细信息,请参阅PEP 617。(由Guido van Rossum,Pablo Galindo和Lysandros Nikolaou在BPO-40334中贡献。)。

__import__()现在引发ImportError,而不是ValueError,后者过去是在相对导入粘贴顶级包时发生的。(由BPO-37444中的Ngalim Siregar贡献)。

Python现在获得在命令行上指定的脚本文件名的绝对路径(例如:python3script.py):__main__模块的__file__属性变成了绝对路径,而不是相对路径。在os.chdir()更改当前目录后,这些路径现在仍然有效。作为一个副作用,在这种情况下,回溯还会显示__Main__模块帧的绝对路径。(由BPO-20443中的Victor Stner提供。)。

在Python开发模式和调试版本中,现在为字符串编码和解码操作检查编码和错误参数。示例:open()、str.encode()和bytes.decode()。

默认情况下,为了获得最佳性能,只在第一个编码/解码错误时检查Errors参数,有时为空字符串指定ENCODING参数。(由BPO-37388中的Victor Stner提供。)。

";";.place(";";,s,n)现在返回s,而不是所有非零n的空字符串。它现在与";";";.place(";";,s)一致。字节和字节数组对象也有类似的更改。(由BPO-28029中的Serhiy Storchaka贡献。)。

现在,任何有效的表达式都可以用作装饰符。以前,语法要严格得多。详情见PEP614。(由Brandt Bucher在BPO-39702中贡献。)。

改进了打字模块的帮助。现在为所有特殊形式和特殊通用别名(如UNION和LIST)显示文档字符串。将help()与通用别名一起使用(如LIST[INT])将显示对应的具体类型(本例中为LIST)的帮助。(由Serhiy Storchaka在bpo-40257中提供)。

添加包含Graphlib.TopologicalSorter类的Graphlib,以提供执行图形拓扑排序的功能。(由巴勃罗·加林多、蒂姆·彼得斯和拉里·黑斯廷斯在BPO-17005中贡献。)。

向dump()添加了缩进选项,允许它产生多行缩进输出。(由Serhiy Storchaka在BPO-37995中贡献)。

将ast.unparse()作为函数添加到ast模块中,该函数可用于解解析ast.AST对象并生成一个带有代码的字符串,该字符串在解析时将生成等效的ast.AST对象。(由BPO-38870中的Pablo Galindo和Batuhan Taskaya贡献。)。

向包含用于构造该节点的ASDL签名的AST节点添加了文档字符串。(由BATUHAN TASKAYA在BPO-39638中贡献。)

由于严重的安全问题,不再支持asyncio.loop.create_Datagram_Endpoint()的RESERVE_ADDRESS参数。这是由于UDP中套接字选项SO_REUSEADDR的行为所致。有关更多详细信息,请参阅loop.create_Datagram_Endpoint()的文档(由BPO-37228中的Kyle Stanley、Antoine Pitrou和Yury Selivanov贡献)。

添加了新的协程SHUTDOWN_DEFAULT_EXECUTOR(),它为等待ThreadPoolExecutor完成关闭的默认执行器安排关闭。此外,asyncio.run()已经更新为使用新的协程(由Kyle Stanley在BPO-34037中贡献)。

添加了一个新的协程asyncio.to_thread()。它主要用于在单独的线程中运行IO绑定函数,以避免阻塞EventLoop,本质上是作为Run_in_Executor()的高级版本,可以直接接受关键字参数。(由Kyle Stanley和Yury Selivanov在BPO-32309中贡献)。

添加了对复制的.pyc文件使用硬链接的新可能性:HARDLINK_DUPES参数和-HARDLINK-DUPES命令行选项。(由Lumír‘Frenzy’Balhar在bpo-40495中提供。)。

在生成的.pyc文件中添加了新的路径操作选项:stripdir、preenddir、limit_sl_est参数和-s、-p、-e命令行选项。添加了多次指定优化级别选项的可能性。(由Lumír‘Frenzy’Balhar在bpo-38112中提供。)。

在concurrent.futures.Executor.shutdown()中添加了一个新的CANCEL_FURTURES参数,该参数取消所有尚未开始运行的挂起的未来,而不是等待它们完成后再关闭执行器。(由凯尔·斯坦利在BPO-39349中提供。)。

已从ThreadPoolExecutorand ProcessPoolExecutor中删除守护程序线程。这提高了与子解释器的兼容性和关闭过程中的可预测性。(凯尔·斯坦利在BPO-39812中贡献。)。

ProcessPoolExecutor中的工作进程现在仅在没有可用的空闲工作进程可重用时按需派生。这优化了启动开销,减少了空闲工作者损失的cpu时间。(由Kyle Stanley在BPO-39207中贡献)

Upload命令现在创建SHA2-256和Blake2b-256散列摘要。它在阻止md5摘要的平台上跳过md5(由Christian Heimes在bpo-40698中贡献)。

FTP和FTP_TLS现在如果其构造函数的给定超时为零以阻止创建非阻塞套接字,则会引发ValueError。(由BPO-39259中的纳东熙贡献。)。

当垃圾收集器进行一些对象复活的回收时(在终结器执行完之后,可以从隔离的循环外部访问它们),不要阻止对所有仍然可访问的对象的回收。(由巴勃罗·加林多和蒂姆·彼得斯在BPO-38379中贡献。)。

添加了一个新函数gc.is_finded()来检查对象是否已由垃圾收集器完成。(由巴勃罗·加林多在BPO-39322中贡献。)。

现在可以使用./configure--less-builtin-hashlib-hash禁用内置散列模块,或者使用.g有选择地启用内置散列模块。./configure--with-builtin-hashlib-hash=sha3,blake2强制使用基于openssl的实现。(Christian Heimes在bpo-40479中贡献)。

HTTP状态代码103 EARLY_HINTS、418 IM_A_TEAPOT和425 TOO_EARLY被添加到http.HTTPStatus。(由BPO-39509中的纳东熙和BPO-39507中的罗斯·罗兹贡献。)。

IMAP4和IMAP4_SSL现在的构造函数有一个可选的超时参数,open()方法也有一个可选的超时参数。被覆盖的IMAP4SSL和IMAP4STREAM方法被应用于此更改。(由BPO-38615中的Donong-hee Na提供。)。

将添加imaplib.IMAP4.unselect()。Imaplib.IMAP4.unselect()释放与所选邮箱关联的服务器资源,并将服务器返回到已验证状态。此命令执行与imaplib.IMAP4.close()相同的操作,不同之处在于不会从当前选定的邮箱中永久删除任何邮件。(由BPO-40375中的纳东熙贡献。)

为了提高与导入语句的一致性,现在,对于无效的relativeimport尝试,ImportError()会引发ImportError,而不是ValueError。(由BPO-37444中的Ngalim Siregar提供。)。

可以使用ipaddress。IPv6Address.IPv6Address.ipv6解析作用域地址。如果存在,作用域区域ID可以通过属性获得。(由BPO-34788中的Oleksandr Pavliuk提供。)。

扩展了math.gcd()函数以处理多个参数,以前它只支持两个参数(由BPO-39648中的Serhiy Storchaka贡献)。

Add math.lcm():返回指定参数的最小公倍数。(由Mark Dickinson、Ananthakrishnan和Serhiy Storchaka在bpo-39479和bpo-39648中贡献)。

Add math.nextafter():返回x之后的下一个浮点值y。(由BPO-39288中的Victor Stner贡献。)。

Add math.ulp():返回浮点数的最低有效位的值。(由BPO-39310中的Victor Stner贡献)。

SimpleQueue类有一个新的Close()方法来显式关闭队列(由BPO-30966中的Victor Stner提供)。

NNTP和NNTP_SSL现在如果其构造函数的给定超时为零以阻止创建非阻塞套接字,则会引发ValueError。(由BPO-39259中的纳东熙贡献。)

Add os.waitstatus_to_exitcode()函数:将等待状态转换为退出代码。(由BPO-40094中的Victor Stner提供。)。

现在,如果构造函数的给定超时为零,POP3和POP3_SSL将引发ValueError,以防止创建非阻塞套接字。(由BPO-39259中的纳东熙贡献。)。

现在不仅为类、函数、方法等显示文档字符串,而且为任何具有自己的__doc__属性的对象显示文档字符串。(由Serhiy Storchaka在BPO-40257中贡献)。

公开了特定于Linux的信号.pidfd_send_ignal(),用于使用文件描述符而不是PID将信号发送到进程。(邮政总局-38712)。

现在,如果其构造函数的给定超时为零,SMTP和SMTP_SSL将引发ValueError,以防止创建非阻塞套接字。(由BPO-39259中的纳东熙贡献。)。

套接字模块现在可以在Linux4.1和更高版本上导出CANRAW_JOIN_FILTERS常量(由Stefan Tatschner和Zackery Spytz在BPO-25780中提供)。

套接字模块现在在支持它的平台上支持CAN_J1939协议。(由Karl Ding在BPO-40291中贡献。)。

添加一个新属性:特定于平台的库目录的名称。用于构建标准库路径和安装扩展模块路径。在大多数平台上,它等同于";lib&34;。在Fedora和SuSE上,它相当于64位平台上的lib64;lib64;(由Jan MatěJek、Matěj Cepl、Charalampos Stratakis和Victor Stner在BPO-1294959中贡献)。

以前,在非交互时是块缓冲的。现在,stderr默认总是行缓冲的。(由Jendrik Seipp在BPO-13601中贡献。)。

添加tracemalloc.Reset_PEAK(),将跟踪的内存块的峰值大小设置为当前大小,以测量特定代码段的峰值。(Huon Wilson在BPO-40630中贡献)。

PEP593引入了tying.Annotated类型来用特定于上下文的元数据装饰现有类型,并为tying.get_type_hints()引入了新的include_Extras参数来在运行时访问元数据。(供稿:Till Varoquaux和Konstantin Kashin)。

Venv提供的激活脚本现在都通过始终使用__VENV_PROMPT__指定的值一致地指定其提示自定义。以前,一些脚本无条件地使用__VENV_PROMPT__,其他脚本仅在碰巧设置的情况下才使用__VENV_PROMPT__(这是默认情况),而另一个脚本则使用__VENV_NAME__。(由bpo-37663中的Brett Cannon提供。)。

现在,将xml.etree.ElementTree序列化为XML文件时,属性中的空格字符将被保留。EOLN不再标准化为“n”。这是关于如何解释XML规范第2.11节的讨论的结果。

优化了为理解中的临时变量赋值的习惯用法。现在,对于[expr]中的y,在理解中的赋值速度与简单的赋值y=expr一样快。例如:

SUM=[s for s in[0]for x for x for s in[s+x]]。

优化多线程应用程序中的信号处理。如果与主线程不同的线程收到信号,则字节码求值循环在每个字节码指令处不再中断,以检查无法处理的挂起信号。只有主解释器的主线程才能处理信号。

以前,在主线程处理信号之前,字节码求值循环在每条指令处都会中断。(由BPO-40010中的Victor Stner贡献)。

使用closefrom()优化FreeBSD子进程模块。(由Ed Maste、Conrad Meyer、Kyle Evans、Kubilay Kocak和VictorStner在BPO-38061中贡献)。

Python版本3.4 3.5 3.6 3.7 3.8 3.9-变量和属性读取访问权限:READ_LOCAL 7.1 7.1 5.4 5.1 3.9 4.0 READ_NONLOCAL 7.1 8.1 5.8 5.4 4.4 4.8 READ_GLOBAL 15.5 19.0 14.3 13。6 7.6 7.7 Read_Builtin 21.1 21.6 18.5 19.0 7.5 7.7 Read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6 read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1 Read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7 Read_instancevar_插槽27.8 31.3 20.8 20.8 20.2 24。.5读取命名元组73.8 57.5 45.0 46.8 18.4 23.2读取边界方法37.6 37.9 29.6 26.9 27.7 45.9变量和属性写入访问:WRITE_LOCAL 8.7 9.3 5.5 5.5 5.3 4.3 4.2 WRITE_NONLOCAL 10.5 11.1 5.6 5.5 4.7 4.9 WRITE_GLOBAL 19.7 21.2 18.0 18.0 15.8 17.2 WRITE_classvar 92.9 96。0 104.6 102.1 39.2 43.2 WRITE_INSTANCEVAR 44.6 45.8 40.0 38.9 35.5 40.7 WRITE_INSTANCEVAR_SLOTS 35.6 36.1 27.3 26.6 25.7 27.7数据结构读取访问:READ_LIST 24.2 24.5 20.8 19.0 21.1 READ_DEQUE 24.7 25.5 20.2 20.6 19.8 21.6 READ_DICT 24.3 25.7 22.3 23.0 21。0 22.5 read_strdict 22.6 24.3 19.5 21.2 18.9 21.6数据结构写访问:write_list 27.1 28.5 22.5 21.6 20.0 21.6 write_deque 28.7 30.1 22.7 21.8 23.5 23.2 write_dict 31.4 33.3 29.3 29.2 24.7 27.8 write_strdict 28.4 29.9 27.5 25.2 23.1 29.8堆栈(或队列)操作:列表。_APPEND_POP 93.4 112.7 75.4 74.2 50.8 53.9 DEQUE_APPEND_POP 43.5 57.0 49.4 49.2 42.5 45.5 DEQUE_APPEND_POPFT 43.7 57.3 49.7 49.7 42.8 45.5计时循环:LOOP_OPEAD 0.5 0.6 0.4 0.3 0.3。

这些结果是从变量访问基准脚本生成的,该脚本位于:tools/scripts/var_access_Benchmark.py。基准脚本以纳秒为单位显示计时。这些基准测试是在英特尔®酷睿™i7-4960HQ处理器上进行的,该处理器运行可在python.org上找到的MacOS64位版本。

通过使用PEP590向量调用协议,许多Python内置(范围、元组、集合、冻结集、列表、字典)现在被加速。(由BPO-37207中东熙·纳、马克·香农、Jeroen Demeyer和Petr Viktorin贡献)。

Distutils bdist_msi命令现在已弃用,请改用bdist_war(轮包)。(由BPO-39586中的Hugo van Kemenade贡献)。

目前,math.factorial()接受非负整数值的Float实例(如5.0)。它引发非整数和负浮点数的ValueError。它现在已被弃用。在未来的Python版本中,它将为所有浮点数引发类型错误。(由Serhiy Storchaka在BPO-37315中贡献)。

解析器和符号模块已弃用,并将在未来的Python版本中删除。对于大多数用例,用户可以使用AST模块利用抽象语法树(AST)生成和编译阶段。

公共C API函数PyParser_SimpleParseStringFlags()、PyParser_SimpleParseStragsFlagsFilename()、PyParser_SimpleParseFileFlags()和PyNode_Compile()已弃用,将与旧解析器一起在Python 3.10中删除。

不建议在布尔上下文中使用NotImplemented,因为它几乎完全是不正确的丰富比较器实现的结果。在Python的未来版本中,它将成为一个类型错误(Josh Rosenberg在BPO-35712中贡献)。

随机模块当前接受任何可哈希类型作为可能的种子值。不幸的是,其中一些类型不能保证具有确定性的散列值。在Python3.9之后,模块将其种子限制为NONE、INT、FLOAT、STR、BYTES和bytearray。

不建议在不指定模式参数的情况下打开要写入的GzipFile文件。在未来的Python版本中,默认情况下它将始终打开以供阅读。指定用于打开它的模式参数,以便写入和静默警告。(由BPO-28286中的Serhiy Storchaka提供。)。

不推荐使用SplitList()方法的_tkinter.TkappType的Split()方法,该方法具有更一致和可预测的行为。(由Serhiy Storchaka在BPO-38371中提供。)。

不推荐显式地将协程对象传递给asyncio.wait(),并将在V3.11中删除。(由BPO-34790中的Yury Selivanov和Kyle Stanley贡献)。

Binhe4和hebin4标准现在已弃用。现在不建议使用binhex模块和以下binascii函数:

AST类Slice、Index和ExtSlice被认为是不受欢迎的,将在未来的Python版本中删除。应该使用Value本身而不是Index(Value)。应该使用元组(Slices,load())而不是ExtSlice(Slices)。(由Serhiy Storchaka在BPO-32892中提供。)

它们不是由解析器生成的,也不被Python3中的代码生成器接受(由bpo-39639中的Batuhan Taskaya和bpo-39969中的Batuhan Taskaya和bpo-39988中的Serhiy Storchaka贡献)。

PyEval_InitThread()和PyEval_ThreadsInitialized()函数现在已弃用,将在Python 3.11中删除。调用PyEval_InitThread()现在不执行任何操作。从Python3.7开始,GIL由Py_Initialize()初始化(由BPO-39877中的Victor Stner贡献)。

将None作为第一个参数传递给shlex.plit()函数h。

.