
Python 3.12 新特性全面总结发布时间2023 年 10 月 2 日官方文档https://docs.python.org/zh-cn/3.12/whatsnew/3.12.html一、重磅新语法1. 类型参数语法与type语句PEP 695全新的泛型声明方式更简洁、更明确# 泛型函数简洁语法defmax[T](args:Iterable[T])-T:...# 泛型类classlist[T]:def__getitem__(self,index:int,/)-T:...defappend(self,element:T)-None:...# 类型别名新增 type 语句typePointtuple[float,float]# 泛型类型别名typePair[T]tuple[T,T]# 带约束的类型变量typeIntOrStr[T:(int,str)]list[T]# ParamSpec 和 TypeVarTupletypeIntFunc[**P]Callable[P,int]# ParamSpectypeLabeledTuple[*Ts]tuple[str,*Ts]# TypeVarTuple# 带边界约束typeHashableSequence[T:Hashable]Sequence[T]优势类型参数作用域清晰[T]内可见延迟求值类型别名可引用后续定义的类型无需TypeVar语法更直观2. f-string 语法松绑PEP 701Python 3.12 解除了 f-string 的诸多限制现在可以1) 复用引号# 之前3.11报错fThis is the playlist: {,.join(songs)}# 现在3.12正常fThis is the playlist: {,.join(songs)}# This is the playlist: Take me back to Eden, Alkaline, Ascensionism2) 任意嵌套# 之前嵌套深度受限f{f{f{f{11}}}}# 现在可任意嵌套f{f{f{f{f{11}}}}}3) 多行表达式 注释fThis is the playlist: {,.join([Take me back to Eden,# My, my, those eyes like fireAlkaline,# Not acid nor alkalineAscensionism# Take to the broken skies at last])}4) 支持反斜杠和 Unicode 转义# 反斜杠print(fNewline: {\n.join(songs)})# Unicode 转义print(fHearts: {\N{BLACK HEART SUIT}.join(songs)})# Hearts: Take me back to Eden♥Alkaline♥Ascensionism二、解释器改进1. 每解释器独立 GILPEP 684子解释器现在可以拥有独立的 GIL充分利用多核 CPU# 目前仅通过 C API 可用Python API 计划在 3.13 提供PyInterpreterConfig config{.check_multi_interp_extensions1,.gilPyInterpreterConfig_OWN_GIL,};2. 低开销监控PEP 669新增sys.monitoring模块近零开销的调试和覆盖率工具importsys.monitoring# 监控事件类型# sys.monitoring.events.CALL, RETURN, LINE, EXCEPTION, JUMP, ...3. 列表/字典/集合推导式内联PEP 709推导式不再创建单独函数帧性能提升最高 2 倍# 之前每次执行创建一个函数对象[x*2forxinrange(1000)]# 现在直接内联执行无额外开销注意traceback 不再显示推导式作为单独帧三、错误提示继续增强NameError 智能建议扩展1) 建议标准库模块sys.version_info NameError:namesysisnotdefined.Did you forget toimportsys?2) 实例属性建议classA:def__init__(self):self.blech1deffoo(self):somethinblech# 建议 self.blechA().foo()# NameError 提示 self.xxxNameError:nameblechisnotdefined.Did you mean:self.blech?ImportError 改进# ImportError 提示拼写fromcollectionsimportchainmap ImportError:cannotimportnamechainmapfromcollections.Did you mean:ChainMap?importa.y.zfromb.y.z SyntaxError:Did you mean to usefrom ... import ...instead?四、标准库重要改进1.isinstance()协议检查提速运行时可检查协议runtime_checkable的isinstance()检查提速2-20 倍fromtypingimportProtocol,runtime_checkableruntime_checkableclassClosable(Protocol):defclose(self)-None:...# 现在快 2-20 倍isinstance(f,Closable)2.pathlib.Path支持子类化classMyPath(Path):defwith_segment(self,segment:str)-MyPath:returnself/segment新增Path.walk()类似os.walk()fornameinPath(.).walk():print(name)新增case_sensitive参数Path(data).glob(*.txt,case_sensitiveFalse)3.os模块 Windows 增强# 列出驱动器、卷、挂载点Windowsos.listdrives()# [C:\\, D:\\]os.listvolumes()# [\\\\?\\Volume{...}\\]os.listmounts(C:\\)# 挂载点# 更准确的 stat()os.stat(file).st_birthtime# 文件创建时间os.stat(file).st_ctime# 现在也是创建时间未来会改为元数据变更时间4.itertools.batched()批量分组迭代器fromitertoolsimportbatchedforbatchinbatched(range(10),3):print(list(batch))# [0, 1, 2]# [3, 4, 5]# [6, 7, 8]# [9]5.math模块增强importmath math.sumprod([1,2],[3,4])# 1*3 2*4 11 计算乘积之和点积math.nextafter(1.0,2.0,steps10)# 10 步后的值6.sqlite3命令行界面python-msqlite3 mydb.db7.uuid命令行界面python-muuid python-muuid.uuid1 python-muuid.uuid48.statistics.correlation()扩展支持 Spearman 秩相关fromstatisticsimportcorrelation correlation(x,y,methodranked)# Spearman 相关9.random.binomialvariate()新增二项分布随机数importrandom random.binomialvariate(100,0.5)# n100, p0.510.calendar枚举importcalendar calendar.Month.JANUARY# 1calendar.Day.MONDAY# 0五、类型注解改进1.typing.override()装饰器PEP 698明确标记方法覆盖父类方法帮助类型检查器验证fromtypingimportoverrideclassChild(Parent):overridedefmethod(self)-None:# 类型检查器验证是否真的覆盖了...override# 如果父类没有此方法类型检查器报错defbad_method(self)-None:...2. TypedDict 注解**kwargsPEP 692fromtypingimportTypedDict,UnpackclassConfig(TypedDict):host:strport:intdefsetup(**kwargs:Unpack[Config])-None:...3. f-string 错误位置更精确f-string 表达式错误现在能精确定位整行# 之前3.11(x z y)^^^SyntaxError:f-string:invalid syntax# 现在3.12my_stringf{x z y}f{11}^^^SyntaxError:invalid syntax六、安全与性能1. 哈希算法更新hashlib内置的 SHA1、SHA3、SHA2-384、SHA2-512、MD5 实现替换为 HACL* 项目经过形式化验证的代码。2. Linux perf profiler 支持python-Xperf program.py# 或PYTHONPERFSUPPORT1python program.py生成.perf文件可用perf report分析。3. 递归限制只影响 Python 代码内置函数不再受sys.setrecursionlimit()影响由独立机制保护防止虚拟机崩溃。4. 栈溢出保护在支持的平台上实现了栈溢出保护。七、弃用与移除正式移除移除内容说明distutils包已弃用3.12 彻底移除。改用setuptoolsasynchat、asyncore模块已移除改用asyncioimp模块已移除wstr成员PEP 623str 对象减小至少 8 字节不再预装 setuptoolsvenv创建的虚拟环境不再预装setuptools如需使用需手动pip install setuptools。语法警告升级无效转义序列如\d现在产生SyntaxWarning之前是DeprecationWarning未来版本将变为SyntaxError。八、其他值得关注的变化语言层面slice对象可哈希可用作字典键和集合元素sum()使用 Neumaier 求和浮点数求和更精确推导式中未存储的变量可用于赋值表达式如[(b : 1) for a, b.prop in iter]memoryview支持半浮点类型e格式码tarfile提取过滤器防止路径穿越攻击3.14 默认开启datatypes.MappingProxyType可哈希如果底层映射可哈希GC 不再依赖对象分配在 eval breaker 上运行shutil改进# 新 onexc 参数替代 onerrorshutil.rmtree(path,onexclambdaf,e:handle(e))# which() 在 Windows 上考虑 PATHEXTthreading改进# 设置所有线程的 trace/profilethreading.settrace_all_threads(func)threading.setprofile_all_threads(func)总结Python 3.12 的核心亮点类型参数语法type语句— 泛型声明更简洁延迟求值f-string 完全松绑— 支持引号复用、多行、注释、反斜杠、嵌套每解释器独立 GIL— 多核利用的里程碑低开销监控 API—sys.monitoring模块列表推导式内联— 性能提升最高 2 倍isinstance()协议检查提速 2-20 倍pathlib.Path子类化 walk()方法错误提示继续增强— 标准库建议、self属性建议Python 3.12 是一个语言语法和类型系统现代化的版本f-string 的解放解决了长期痛点类型语法的简化让泛型编程更直观同时性能优化继续深入。参考Python 3.12 官方文档 - What’s New内容由 AI 整理生成内容仅供参考请仔细甄别。