Python中文社区(ID:python-china)Python3.10的开发已经趋于稳定,我们终于可以测试最终版本中将包含的所有新特性了。下面我们将介绍Python3.10中一些最有趣的新增功能——结构模式匹配、带括号的上下文管理器、更多类型和新的错误消息。结构模式匹配结构模式匹配是要添加到Python中的一项很棒的功能。想象一下这样的if-else语句(Python3.9):http_code="418"ifhttp_code="200":print("OK")elifhttp_code="404":print("NotFound")elifhttp_code="418":print("I'mateapot")else:print("Codenotfound")输出:I'mateapotPython3.10可以这样写:http_code="418"matchhttp_code:case"200":print("OK")case"404":print("NotFound")case"418":print("I'mateapot")case_:print("Codenotfound")这是新的匹配案例语句-很酷,但还没有什么特别的地方。让match-case语句如此有趣的是一种叫做结构模式匹配的东西。结构模式匹配允许我们执行相同的匹配案例逻辑,但基于我们的比较对象的结构是否匹配给定的模式。因此,让我们定义两个字典,它们都具有不同的结构。dict_a={'id':1,'meta':{'source':'abc','location':'west'}}dict_b={'id':2,'source':'def','location':'west'}现在,我们可以编写一个模式来匹配dict_a,如下所示:{'id':int,'meta':{'source':str,'location':str}}和一个匹配模式dict_b:{'id':int,'source':str,'location':str}如果我们将这两个放在匹配案例语句中,以及有效的else/和catch-allcase_-我们得到:#loopthroughbothdictionariesanda'test'fordin[dict_a,dict_b,'test']:matchd:case{'id':ident,'meta':{'source':source,'location':loc}}:print(ident,source,loc)case{'id':ident,'source':source,'location':loc}:print(ident,source,loc)case_:print('nomatch')output:1abcwest2defwestnomatch是不是很酷?我发现这对于数据操作非常有用。带括号的上下文管理器的一个小变化是新的基于PEG的解析器。以前的Python解释器有很多限制,这限制了Python开发人员可用的语法。Python3.9的基于PEG的解析器消除了这些障碍,从长远来看,这可能会带来更优雅的语法——这种变化的第一个例子是新的带括号的上下文管理器。在Python3.9之前,我们可以这样写来打开两个(或更多)文件I/O流:withopen('file1.txt','r')asfin,open('file2.txt','w')asfout:fout.write(fin.read())第一行很长。但是由于解析器的限制,我们可以将此行拆分为多行的唯一方法是使用\行继续符:withopen('file1.txt','r')asfin,\open('file2.txt','w')asfout:fout.write(fin.read())它有效,但不是很Pythonic。使用新的解析器,我们现在可以打破括号将这一行分成多行,如下所示:with(open('file1.txt','r')asfin,open('file2.txt','w')asfout):fout.write(fin.read())非常Python化。现在,在我们继续之前,如果我们写:with(open('file1.txt','r')asfin,open('file2.txt','w')asfout):fout.write(fin.read())也可以用Python3.9编写。这是因为较新的解析器启用了此语法,尽管直到Python3.10才正式支持它。打字功能Python的打字功能也有更多的更新。这里最有趣的添加是包含一个新的运算符,它的行为类似于我们之前使用Union方法实现的类型化OR逻辑:fromtypingimportUniondefadd(x:Union[int,float],y:Union[int,float]]):returnx+y现在,我们不需要写fromtypingimportUnion了,Union[int,float]已经简化为int|float,看起来更简洁:defadd(x:int|float,y:int|float):returnx+y更完整的报错信息相信你第一次看到会去百度或者谷歌搜索:SyntaxError:unexpectedEOFwhileparsing输入SyntaxError时,谷歌排名第一的结果说明我们很多人确实在某个时候做过.这不是一个明确的错误信息,Python充满了不太明确的错误信息。幸运的是,有人注意到了它们——其中许多消息都得到了显着改进。官方更改列表中提到了更多更改-但在测试期间似乎没有出现,包括:fromcollectionsimportnamedtoplo>AttributeError:module'collections'hasnoattribute'namedtoplo'.Didyoumean:namedtuple?在这里,AttributeError与之前相同,但增加了建议namedtoplo的属性名称被识别为属性namedtuple的潜在拼写错误。同样,我们看到NameError消息的相同改进:new_var=5print(new_vr)>NameError:name'new_vr'isnotdefined.Didyoumean:new_var?总结这些是Python3.10中引入的一些关键新特性!完整版本预计将于2021年10月4日发布,从现在开始,Python开发人员将致力于改进已添加的内容——但不会引入新功能。如果您想自己检查一下,可以从此处下载3.10.0b1。
