python3.8 新特性
https://docs.python.org/3.8/whatsnew/3.8.html
python 3.8的新功能
本文解释了与3.7相比,python 3.8中的新特性。
有关完整的详细信息,请参阅变更日志。
注意:预发布用户应注意,此文档当前处于草稿形式。随着python 3.8向发行版迈进,它将得到实质性的更新,所以即使在阅读了早期版本之后,也值得检查一下。
总结-发布亮点
新特点
编译字节码文件的并行文件系统缓存
新的pythonpycacheprefix设置(也可用作-x pycache_prefix)将隐式字节码缓存配置为使用单独的并行文件系统树,而不是每个源目录中的默认子目录。
缓存的位置以sys.pycache_前缀报告(none表示子目录中的默认位置)。
(由Carl Meyer在BPO-33499中提供。)
其他语言更改
由于实现有问题,Continue语句在finally子句中是非法的。在python 3.8中,这个限制被解除了。(由Serhiy Storchaka在BPO-32489中提供。)
int类型现在有了一个新的as_integer_ratio()方法,与现有float.as_integer_ratio()方法兼容。(由Lisa Roach在BPO-33073中提供。)
添加了对正则表达式中\n name转义的支持。(乔纳森·尤尼斯和塞尔希·斯托查卡在BPO-30688中作了贡献。)
dict和dictView现在可以使用reversed()按相反的插入顺序进行迭代。(由R_mi Lapeyre在BPO-33462中提供。)
函数调用中关键字名称所允许的语法受到了进一步的限制。特别是,不再允许使用f((关键字)=arg。它从来没有打算允许在关键字参数赋值项的左侧使用一个以上的裸名称。见BPO-34 464。
现在允许在yield和return语句中不带括号的iterable解包。(大卫·卡斯伯特和约旦·查普曼在BPO-32117中作了贡献。)
反斜杠字符对不是有效的转义序列,会生成自Python3.6以来的DeprecationWarning。在Python3.8中,它生成一个语法警告。(由Serhiy Storchaka在BPO-32912中提供。)
在某些情况下,当元组或列表前面缺少逗号时,编译器现在会生成语法警告。例如:
数据=
(1,2,3)噢,缺少逗号!
(4, 5, 6)
]
(由Serhiy Storchaka在BPO-15248中提供。)
datetime.date或datetime.datetime子类与datetime.timedelta对象之间的算术运算现在返回子类的实例,而不是基类。这还影响其实现(直接或间接)使用datetime.timeDelta算法(如datetime.datetime.astimeZone())的操作的返回类型。(保罗甘斯勒在BPO-32417中作了贡献。)
新模块
还没有。
改进的模块
collections.namedtuple()的_asdict()方法现在返回dict,而不是collections.ordereddict。这是因为自Python3.7以来,常规的dict已经保证了排序。如果需要ordereddict的额外功能,建议的补救措施是将结果强制转换为所需的类型:ordereddict(nt.\u asdict())。(由Raymond Hettinger在BPO-35864中提供。)
阿辛乔
在Windows上,默认的事件循环现在是ProactiveEventLoop。
获得文本
添加了pgetext()及其变体。(由Franz Glasner、Ric Araujo和Cheryl Sabella在BPO-2504中提供。)
GZIP
将mtime参数添加到gzip.compress()以获得可复制的输出。(郭慈涛在BPO-34898中撰文)
idlelib和idle
N行上的输出(默认为50)被压缩为一个按钮。n可以在设置对话框的常规页面的pyshell部分更改。用鼠标右键单击输出可以压缩的行更少,但也可能更长。通过双击按钮或右键单击按钮进入剪贴板或单独的窗口,可以就地扩展压缩输出。(Tal Einat在BPO-1529353中作了贡献。)
以上更改已返回到3.7维护版本。
JSON工具
添加选项--json行,将每个输入行解析为单独的json对象。(韦鹏洪在BPO-31553中作了贡献。)
数学
增加了新的函数math.dist(),用于计算两点之间的欧几里得距离。(由Raymond Hettinger在BPO-33089中提供。)
扩展了math.hypot()函数以处理多个维度。以前,它只支持二维案例。(由Raymond Hettinger在BPO-33089中提供。)
添加了新函数math.prod()作为sum()的类似函数,sum()返回“start”值(默认值:1)乘以可数的乘积。(由Pablo Galindo在BPO-35606中提供)
OS.PATH
返回exists()、lexists()、isdir()、isfile()、islink()和ismount()等布尔结果的os.path函数现在返回false,而不是为OS级别上包含不可显示字符或字节的路径引发valueerror或其子类unicodeencodeerror和unicodedecodeerror。(由Serhiy Storchaka在BPO-33721中提供。)
纳克西斯
为基础ncurses库添加了一个保存结构化版本信息的新变量:ncurses_version。(由Serhiy Storchaka在BPO-31680中提供。)
小路
返回布尔结果的pathlib.path方法,如exists()、is_dir()、is_file()、is_mount()、is_symlink()、is_block_device()、is_char_device()、is_fifo()、is_socket()现在返回false,而不是为OS级别上包含不可显示字符的路径引发valueerror或其子类unicodeencodeerror。(由Serhiy Storchaka在BPO-33721中提供。)
舒蒂尔
copytree()现在接受一个新的dirs-exist-ok关键字参数。(乔希·布朗森在BPO-20849中作了贡献。)
SSL
添加sslcontext.post_握手_auth以启用和ssl.sslsocket.verify_client_post_握手()以启动tls 1.3握手后身份验证。(由Christian Heimes在BPO-34670中提供。)
令牌化
标记化模块现在隐式地在提供没有尾随新行的输入时发出新行标记。这种行为现在与C记号赋予器在内部所做的相匹配。(由安马尔·阿斯卡尔在BPO-33899中提供。)
特金特
在tkinter.spinbox类中添加了方法selection_from()、selection_present()、selection_range()和selection_to()。(朱丽叶·蒙塞尔在BPO-34829中作了贡献。)
在tkinter.canvas类中添加了方法moveto()。(由Juliette Monsel在BPO-23831中提供。)
时间
为MacOS 10.12增加了新的时钟运行时间。(由Joannah Nanjekye在BPO-35702中提供。)
单播数据
新函数is_normalized()可用于验证字符串是否为特定的正常形式。(由Max Belanger和David Eurest在BPO-32285中提供)。
单元测试
将AddModuleCleanup()和AddClassCleanup()添加到UnitTest,以支持对SetupModule()和SetupClass()的清理。(由Lisa Roach在BPO-24412中提供。)
静脉注射
venv现在在所有平台上都包含一个activate.ps1脚本,用于在PowerShell Core 6.1下激活虚拟环境。(由BPO-32718中的布雷特·坎农提供。)
XML
作为对DTD和外部实体检索的缓解措施,默认情况下,xml.dom.minidom和xml.sax模块不再处理外部实体。(由Christian Heimes在BPO-17239中提供。)
优化
子进程模块现在可以在某些情况下使用os.posix_spawn()函数以获得更好的性能。目前,只有在满足所有这些条件的情况下,它才用于MacOS和Linux(使用glibc 2.24或更高版本):
关闭错误;
prexec_fn、pass_fds、cwd和start_new_session参数未设置;
可执行路径包含一个目录。
shutil.copy file()、shutil.copy()、shutil.copy2()、shutil.copytree()和shutil.move()在Linux、MacOS和Solaris上使用平台特定的“快速复制”系统调用,以便更高效地复制文件。“快速复制”是指复制操作发生在内核中,避免在python中使用用户空间缓冲区,如“outdd.write(infd.read())”。在Windows Shutil.copyFile()上使用更大的默认缓冲区大小(1 mib而不是16 kib),并使用基于memoryView()的Shutil.copyFileObj()变体。在同一个分区中复制512 mib文件的速度在Linux上约为+26%,在MacOS上为+50%,在Windows上为+40%。此外,CPU周期消耗更少。请参阅平台相关的高效复制操作部分。(由Giampaolo Rodola在BPO-33671中提供。)
copytree()使用os.scandir()函数,所有复制函数都使用缓存的os.stat()值。复制包含8000个文件的目录的速度在Linux上大约是+9%,在Windows上是+20%,在Windows SMB共享上是+30%。另外,os.stat()系统调用的数量减少了38%,使得shutil.copytree()在网络文件系统上的速度更快。(由Giampaolo Rodola在BPO-33695中提供。)
pickle模块中的默认协议现在是协议4,首先在python 3.4中引入。与自Python3.0以来提供的协议3相比,它提供了更好的性能和更小的大小。
从Pygc头上移除一个Py-ssize-t成员。所有GC跟踪的对象(例如tuple、list、dict)的大小都减少了4或8个字节。(Inada Naoki在BPO-33597中提供)
uuid.uuid现在使用槽来减少内存占用。
operator.itemgetter()的性能提高了33%。优化了参数处理,并将单个非负整数索引的常见情况的快速路径添加到元组中(这是标准库中的典型用例)。(由Raymond Hettinger在BPO-35664中提供。)
加速collections.namedDuple()中的字段查找。它们现在的速度比以前快了两倍多,这使得它们成为Python中最快的实例变量查找形式。(由Raymond Hettinger、Pablo Galindo和Serhiy Storchaka在BPO-32492中提供。)
如果输入iterable的长度已知(输入实现了len_uuuuuuuuuuuuuu),则列表构造函数不会过度分配内部项缓冲区。这使得创建的列表平均减少了12%。(由Raymond Hettinger和Pablo Galindo在BPO-33234中提供。)
构建和C API更改
pybytearray_init()和pybytearray_fini()函数已被删除。自从python 2.7.4和python 3.2.0被排除在有限的api(稳定的abi)之外之后,它们什么也没有做,也没有被记录下来。
pyexceptionclass_name()的结果现在是const char*类型,而不是char*类型。(由Serhiy Storchaka在BPO-33818中提供。)
模块/setup.dist和模块/设置的双重性已被移除。以前,在更新cpython源树时,必须手动将modules/setup.dist(在源树中)复制到modules/setup(在构建树中)以反映上游的任何更改。这对打包者来说是一个小的好处,但代价是在cpython开发之后开发人员经常遇到麻烦,因为忘记复制文件可能会导致构建失败。
现在,构建系统总是从源树中的模块/设置中读取。我们鼓励那些想要定制该文件的人在cpython的Git分支或作为补丁文件来维护他们的更改,就像他们对源代码树的任何其他更改一样。
(由Antoine Pitrou在BPO-32430中提供。)
贬低
elementTree模块中已弃用的方法getChildren()和getIterator()现在发出一个DeprecationWarning,而不是PendingDeprecationWarning。它们将在Python3.9中被删除。(由Serhiy Storchaka在BPO-29209中提供。)
将不是concurrent.futures.threadpoolexecutor实例的对象传递到asyncio.loop.set_default_executor()已被弃用,在python 3.9中将被禁止。(由Elvis Pranskevichus在BPO-34075中提供。)
xml.dom.pulldom.domEventstream、wsgiref.util.filewrapper和fileinput.fileinput的getitem方法已被弃用。
这些方法的实现忽略了它们的索引参数,而是返回下一个项。
(由Berker Peksag在BPO-9372中提供。)
AST类num、str、bytes、nameconstant和省略号被视为已弃用,将在将来的Python版本中删除。应改用常量。(由Serhiy Storchaka在BPO-32892中提供。)
getText模块中不推荐使用以下函数和方法:lgetText()、ldgetText()、lngetText()和ldngettext()。它们返回已编码的字节,如果转换后的字符串存在编码问题,则可能会出现意外的与Unicode相关的异常。在python 3中使用返回unicode字符串的替代方法要好得多。这些功能已经中断很长时间了。
函数bind_textDomain_codeset()、方法output_charset()和set_output_charset()以及函数translation()和install()的codeset参数也不推荐使用,因为它们仅用于l*getText()函数。
(由Serhiy Storchaka在BPO-33710中提供。)
threading.thread的isalive()方法已被弃用。(董希娜在BPO-35283中作了贡献。)
API和功能删除
以下特性和API已从Python3.8中删除:
已删除python 3.7中不推荐使用的macpath模块。(由Victor Stinner在BPO-35471中提供。)
函数platform.popen()已被删除,由于python 3.3,它已被弃用:改用os.popen()。
pyvenv脚本已被删除,取而代之的是python3.8-m venv,以帮助消除关于pyvenv脚本所绑定的Python解释器的混淆。(由BPO-25427中的布雷特加农提供。)
Parse_qs、Parse_qsl和Escape从CGI模块中删除。不推荐使用python 3.2或更高版本。
文件模式功能从tarfile模块中删除。自python 3.3以来,它没有被记录和弃用。
xmlparser构造函数不再接受html参数。它从未起作用,在Python3.4中被弃用。所有其他参数现在都是关键字。(由Serhiy Storchaka在BPO-29209中提供。)
已删除xmlparser的doctype()方法。(由Serhiy Storchaka在BPO-29209中提供。)
移植到python 3.8
本节列出了前面描述的更改和可能需要更改代码的其他错误修复。
python行为的变化
现在在理解和生成器表达式中不允许使用yield表达式(yield和yield from子句)(除了最左边的for子句中的iterable表达式)。(由Serhiy Storchaka在BPO-10544中提供。)
当标识检查(is和is)与某些类型的文本(如字符串、int)一起使用时,编译器现在生成一个语法警告。这些通常可以在cpython中意外使用,但语言规范并不能保证。警告建议用户使用相等测试(==和!)相反)。(由Serhiy Storchaka在BPO-34850中提供。)
python api中的更改
函数platform.popen()已被删除,由于python 3.3,它已被弃用:改用os.popen()。
tkinter.ttk.TreeView类的selection()方法不再采用参数。在python 3.6中,不赞成将它与更改选择的参数一起使用。使用诸如selection_set()之类的专门方法更改选择。(由Serhiy Storchaka在BPO-31508中提供。)
用标记“r”打开的dbm.dumb数据库现在是只读的。带有标记“r”和“w”的dbm.dumb.open()不再创建不存在的数据库。(由Serhiy Storchaka在BPO-32749中提供。)
在xmlparser的子类中定义的doctype()方法将不再被调用,并将导致发出runtimewarning而不是deprecationwarning。在处理XML doctype声明的目标上定义doctype()方法。(由Serhiy Storchaka在BPO-29209中提供。)
当自定义元类不提供传递给类型的命名空间中的\类单元格\项时,会引发runtimeError。python 3.6–3.7中发出了拒绝警告。(由Serhiy Storchaka在BPO-23722中提供。)
cprofile.profile类现在可以用作上下文管理器。(Scott Sanderson在BPO-29235中作了贡献。)
shutil.copyfile()、shutil.copy()、shutil.copy2()、shutil.copytree()和shutil.move()使用平台特定的“快速复制”系统调用(请参阅依赖平台的高效复制操作部分)。
windows上的shutil.copyfile()默认缓冲区大小已从16 kib更改为1 mib。
PYGC头结构已完全更改。所有接触到结构成员的代码都应该重写。(见BPO-33597)
现在可以通过将name关键字参数传递给asyncio.create_task()或create_task()事件循环方法,或通过对任务对象调用set_name()方法来命名asyncio任务。任务名在asyncio.task的repr()输出中可见,也可以使用get_name()方法进行检索。
mmap.flush()方法现在在成功时返回none,并在所有平台下的错误时引发异常。以前,它的行为依赖于平台:成功时返回非零值;错误时在Windows下返回零。成功时返回零值;在Unix下发生错误时引发异常。(由Berker Peksag在BPO-2122中提供。)
函数math.factorial()不再接受不类似int的参数。(由Pablo Galindo在BPO-33083中提供。)
默认情况下,xml.dom.minidom和xml.sax模块不再处理外部实体。(由Christian Heimes在BPO-17239中提供。)
从只读DBM数据库(dbm.dumb、dbm.gnu或dbm.ndbm)中删除键会引发错误(dbm.dumb.error、dbm.gnu.error或dbm.ndbm.error),而不是keyError。(由Xiang Zhang在BPO-33106中提供。)
cpython字节码更改
解释器循环通过将块堆栈展开到编译器中的逻辑进行了简化。编译器现在发出明确的指令来调整值的堆栈,并调用清除中断、继续和返回代码。
移除的操作码中断_循环、继续_循环、设置_循环和设置_除外。添加新的操作码rot_4,开始_finally,调用_finally和pop_finally。最终改变了end_的行为,并开始清理。
(由Mark Shannon、Antoine Pitrou和Serhiy Storchaka在BPO-17611中提供。)
添加了新的操作码end_async_,用于处理在async for循环中等待下一项时引发的异常。(由Serhiy Storchaka在BPO-33041中提供。)
演示工具
添加了一个基准脚本,用于计时访问变量的各种方式:工具/脚本/var_access_benchm.py。(由Raymond Hettinger在BPO-35884中提供。)