annotationlib
模块提供了灵活的类型提示检查方式# Python 3.14 - 不再需要引号,即使类型未定义
>>> from annotationlib import get_annotations, Format
>>> def new_way(arg: Undefined): # 直接使用未定义类型
... pass
# Python 3.13 及之前版本需要这样写
>>> def old_way(arg: "Undefined"): # 必须加引号,否则报错
... pass
# 可以用不同格式查看类型提示
>>> get_annotations(new_way, format=Format.STRING) # 字符串形式
{'arg': 'Undefined'}
>>> get_annotations(new_way, format=Format.FORWARDREF) # 前向引用对象形式
{'arg': ForwardRef('Undefined', owner=<function new_way at 0x...>)}
--with-tail-call-interp
参数。1python -m pdb -p 1234 # 直接连接到PID为1234的Python进程
_Py_DebugOffsets
中,调试工具可以直接访问PyThreadState
中新加了外部调试支持结构,可以注入调试脚本sys.remote_exec()
功能可以检查和控制运行中的进程f
一样,这种新字符串前面加 t
。from string.templatelib import Template
name = "World"
template = t"Hello {name}" # 返回一个 Template 对象,而不是字符串
Template
类型的对象。有了这个对象,我们就能对模板内容做各种安全处理,比如 HTML 转义和 SQL 注入防护:from string.templatelib import Template, html
# 有恶意代码
evil = "<script>alert('evil')</script>"
# 用模板处理,防止 XSS 攻击
template = t"<p>{evil}</p>"
# 使用 html() 函数转义危险字符
html_safe = html(template)
assert html_safe == "<p><script>alert('evil')</script></p>"
compression.zstd
模块,正式把 Zstandard 压缩格式纳入标准支持。这种由 Meta 公司开发的格式既压得小又压得快,甚至超过很多老牌压缩算法,非常适合处理大数据和网络通信场景。tarfile
、zipfile
和 shutil
模块,现在都能直接处理 Zstandard 压缩包了。而原有的 lzma
、bz2
等压缩模块也被整合到新的 compression
包下,统一了访问方式。// 看看调试模式是否开启
int debug_enabled = _PyConfig_GetBool(config, "debug");
// 指定模块搜索路径
_PyConfig_SetString(config, "pythonpath", "/custom/path");
# 设置环境变量开启 JIT
PYTHON_JIT=1 python3.14 your_script.py
sys._jit
模块检查 JIT 状态:import sys
if hasattr(sys, "_jit"):
print(f"JIT状态: {"启用" if sys._jit.is_enabled() else "未启用"}")
else:
print("JIT不支持")
PYTHON_BASIC_REPL
环境变量。finally
块里用 return
、break
和 continue
跳出去。这种写法以后会被视为语法错误。finally
中的跳转语句通常会导致代码难懂、难维护,容易把异常情况给吞掉,造成莫名其妙的问题。# Python 3.13 允许这种危险写法,但异常会被吞
try:
raise ValueError("重要错误")
except Exception as e:
print(f"捕获到错误: {e}")
raise
finally:
# 这里写 return 会打断异常传递,调用方看不到原始错误
return "似乎一切正常"
# Python 3.14 中,上述代码将在语法层面被禁止
try:
operation()
except ValueError, TypeError: # 可以用逗号分隔多个异常类型
print("处理值错误或类型错误")
# 对异常组也适用同样的语法
try:
operation()
except* ValueError, TypeError: # 异常组也可以用逗号分隔
print("处理值错误或类型错误")
除了 macOS 和 Windows 外,其它平台上 multiprocessing
和 ProcessPoolExecutor
的默认启动方式从 fork
改成了 forkserver
。这能避免一些多线程的问题,但可能要修改依赖于旧行为的代码。
CPython 解释器优化了引用计数机制,去掉了一些不必要的计数更新,所以 sys.getrefcount()
和 Py_REFCNT()
返回的数字可能和以前不一样了。
PEP 738 修改了 async/await 关键字的解析规则,一些极端情况下可能造成不兼容。
distutils
模块在 3.12 中已经被强烈警告,3.14 版本会完全移除。如果还在使用,应该迁移到 setuptools
或 sysconfig
。
imp
模块所有标记为弃用的函数已经删除,应改用 importlib
。
asyncio
模块中的一些废弃函数如 @coroutine
装饰器已被移除,应该用 async/await
语法替代。
XML 模块默认开启了更严格的安全限制,可能会导致原有较宽松的解析器设置失效。
SSL/TLS 模块默认禁用了某些过时的加密算法和协议版本,对于需要与旧系统通信的应用可能要额外配置。