Python3.10于2021年10月3日发布,到现在已经一个月了,相信大家都已经听说了它的新特性。但是,我决定不更新了。我目前使用的版本是Python3.8,我没有怨言。说说我为什么不更新。第一,相关库可能没有跟进。如果更新到最新版本,现有的代码不做修改还能正常运行吗?这是首先要考虑的问题。Python的第三方库基于开源志愿者的工作。他们正在免费做非常有价值的工作,适应新的Python版本需要时间。另外,由于升级涉及到很多不同的群体,需要更多的时间来协调和发布。第二,很多新功能没有使用价值。看看Python3.10没用的新特性(个人看法,可以留言喷):1.with可以加with括号。比如:with(CtxManager1()asexample1,CtxManager2()asexample2,CtxManager3()asexample3,):...这个点我基本不用,也不知道什么情况需要这样写.如果有多个上下文,我就多写几个系列。如果exam??ple1和example2有关联,我可以嵌套:withCtxManager1()asexample1:withCtxManager2()asexample2:......这样是不是更有层次了,看清楚了吗?2.Matchcase只是一个花哨的词。Python3.10增加了match和case软关键字。什么是软关键字?虽然是关键字,但可以作为变量名使用。即便如此,你肯定也不愿意让match成为你的变量名,因为它不会报错:>3.10matchcase的语法如下:matchsubject:case:case:case:case_:有很多用法,其中一些我很难理解。比如我们先从一个简单的开始:defmatch_errno(errno):matcherrno:case0:passcase1:passcase42:print("42!")case_:print("wildcard")这里有个_表示没有匹配,这相当于一个默认值,但是_最初是用来表示一个以后不再使用的变量。如果这样调用,虽然解释有效,但总感觉怪怪的:>>>_=42>>>match_errno(_)42!再来个复杂一点的:defcommand_split(command):matchcommand.split():case["make"]:print("defaultmake")case["make",cmd]:print(f"makecommandfound:{cmd}")case["restart"]:print("restarting")case["rm",*files]:print(f"deletingfiles:{files}")case_:print("didn'tmatch")我认为这段代码在乍一看有问题,cmd和files都是undefined变量,但是可以用在case表达式中,但是实际运行是没问题的:command_split("make")command_split("makeclean")command_split("restart")command_split("rmabc")#defaultmake#makecommandfound:clean#restarting#deletingfiles:['a','b','c']匹配后剩下的部分可以变成一个变量,如果需要可以使用。再看一个:defmatch_capture_subpattern(command):matchcommand.split():case["go",("north"|"south"|"east"|"west")asdirection]:print(f"going{direction}")可以看到还可以和as结合使用。厉害不厉害?最后看一眼:matchpoint:casePoint(x,y)ifx==y:print(f"ThepointislocatedonthediagonalY=Xat{x}.")casePoint(x,y):print(f"Pointisnotonthediagonal.")case也可以使用if,厉害不厉害?这些技巧除了增加程序员的精神负担之外,还有什么好处呢?我用ifelif就可以简单的搞定,可读性高。此外,这种匹配提高了性能,有时甚至更慢。何必呢?为什么Python一开始就没有匹配项?现在都2021年了,加个火柴是不是忘记了初衷?3.NewType提示,我笑死了Python3.9这样写:fromtypingimportUniona:Union[int,str]=1Python3.10可以这样写:a:str|int=1说实话,就算改成|,我年纪不大可能行。类型提示是学习别人静态语言的优点,提示程序的可读性和可维护性,修改代码时不要传递错误的变量类型。更何况Python解释器根本不去检查类型提示是否有错,纯属自娱自乐:>>>deffun(x:int)->str:...returnx...>>>print(fun('asf'))asf>>>如果一个变量可以有多种类型,为什么不提示?提示太多,最好不要提示,是动态语言。玩自己,搞笑,哈哈哈哈。我在使用类型提示时最多使用一种类型,如果类型超过一种,我就不提示了。或者自己修改代码,需要那么多类型吗?第三,它不是很稳定。Python3.9.0将于2020年10月发布。2个月后发布了3.9.1,其中包含一长串错误修复。同样,Python3.10.x可能会有一些错误修复,让它飞一会儿。Python3.10有一个新语法:match-case,但一些格式化工具或IDE可能还不支持它。即使支持,您也需要升级它们。总之,Python3.10.0才一个月,还不是很稳定。那么你可能会问,什么时候才能稳定呢?我觉得比最新版本低1-2分是最好的选择。比如Python3.10发布了,可以考虑升级到Python3.8或者Python3.9,因为当时这些版本都足够稳定。另一方面,除非您使用的版本宣布不支持安全更新,或报告错误,否则您可以不更新。例如,Python3.6将在2021年12月结束安全更新,届时您应该升级到Python3.7或更高版本。最后基于以上三点,我决定不更新Python3.10了。当然Python3.10也有更好的新特性,比如更友好的错误提示,当你的括号和引号没有闭合时,会抛出更清晰的错误。非常喜欢Python之禅的两句话:简单胜于复杂,显式胜于隐式。希望Python的更新也能保持Python之禅的初衷。