说实话,我在官方文档查看了,但是我没看懂...
Python 3.10 有什么新变化
新的语法特性:
PEP 634, 结构化模式匹配: 规范说明
PEP 635, 结构化模式匹配: 动机与理由
PEP 636, 结构化模式匹配: 教程
bpo-12782,加圆括号的上下文管理器现在正式被允许使用。
标准库中的新特性:
PEP 618,向 zip 添加可选的长度检查。
解释器的改进:
PEP 626,在调试和其他工具中使用精确的行号。
新的类型标注特性:
PEP 604,允许 X | Y 形式的联合类型写法
PEP 612,形参规格变量
PEP 613,显式类型别名
PEP 647, User-Defined Type Guards
重要的弃用、移除或限制:
PEP 644,要求 OpenSSL 1.1.1 或更新的版本
PEP 632,弃用 distutils 模块。
PEP 623,弃用并准备移除 PyUnicodeObject 中的 wstr 成员。
PEP 624,移除 Py_UNICODE 编码器 API
PEP 597,增加可选的 EncodingWarning
Python 3.9 有什么新变化
新的语法特性:
PEP 584,为 dict 增加合并运算符;
PEP 585,标准多项集中的类型标注泛型。
PEP 614,放宽对装饰器的语法限制。
新的内置特性:
PEP 616,移除前缀和后缀的字符串方法。
标准库中的新特性:
PEP 593,灵活函数和变量注解;
添加了 os.pidfd_open() 以允许不带竞争和信号的进程管理。
解释器的改进:
PEP 573,从 C 扩展类型的方法快速访问模块状态;
PEP 617,CPython 现在使用基于 PEG 的新解析器;
一些 Python 内置类型(range、tuple、set、frozenset、list、dict)现已使用 PEP 590 vectorcall 加速;
垃圾回收不会因恢复的对象而阻塞;
一些 Python 模块(_abc、audioop、_bz2、_codecs、_contextvars、_crypt、_functools、_json、_locale、math、operator、resource、time、_weakref)现已使用 PEP 489 中定义的多段初始化;
一些标准库模块 (audioop、ast、grp、_hashlib、pwd、_posixsubprocess、random、select、struct、termios、zlib) 现已使用 PEP 384 中定义的稳定 ABI。
新的库模块:
PEP 615,标准库的 zoneinfo 模块现已支持 IANA 时区数据库;
图的拓扑排序实现现在已由新的 graphlib 模块提供。
发布进程的变化:
PEP 602,CPython 采用年度发布周期。
Python 3.8 有什么新变化
赋值表达式
新增的语法 := 可在表达式内部为变量赋值。 它被昵称为“海象运算符”因为它很像是 海象的眼睛和长牙。
在这个示例中,赋值表达式可以避免调用 len() 两次:
if(n:=len(a))>10:print(f"List is too long ({n} elements, expected <= 10)")
类似的益处还可出现在正则表达式匹配中需要使用两次匹配对象的情况中,一次检测用于匹配是否发生,另一次用于提取子分组:
discount=0.0if(mo:=re.search(r'(\d+)% discount',advertisement)):discount=float(mo.group(1))/100.0
此运算符也适用于配合 while 循环计算一个值来检测循环是否终止,而同一个值又在循环体中再次被使用的情况:
# Loop over fixed length blockswhile(block:=f.read(256))!='':process(block)
另一个值得介绍的用例出现于列表推导式中,在筛选条件中计算一个值,而同一个值又在表达式中需要被使用:
[clean_name.title()fornameinnamesif(clean_name:=normalize('NFC',name))inallowed_names]
请尽量将海象运算符的使用限制在清晰的场合中,以降低复杂性并提升可读性。
请参阅 PEP 572 了解详情。
(由 Morehouse 在 bpo-35224 中贡献。)
仅限位置形参
新增了一个函数形参语法 / 用来指明某些函数形参必须使用仅限位置而非关键字参数的形式。 这种标记语法与通过 help() 所显示的使用 Larry Hastings 的 Argument Clinic 工具标记的 C 函数相同。
在下面的例子中,形参 a 和 b 为仅限位置形参,c 或 d 可以是位置形参或关键字形参,而 e 或 f 要求为关键字形参:
deff(a,b,/,c,d,*,e,f):print(a,b,c,d,e,f)
以下均为合法的调用:
f(10,20,30,d=40,e=50,f=60)
但是,以下均为不合法的调用:
f(10,b=20,c=30,d=40,e=50,f=60)# b cannot be a keyword argumentf(10,20,30,40,50,f=60)# e must be a keyword argument
这种标记形式的一个用例是它允许纯 Python 函数完整模拟现有的用 C 代码编写的函数的行为。 例如,内置的 divmod() 函数不接受关键字参数:
defdivmod(a,b,/):"Emulate the built in divmod() function"return(a//b,a%b)
另一个用例是在不需要形参名称时排除关键字参数。 例如,内置的 len() 函数的签名为 len(obj, /)。 这可以排除如下这种笨拙的调用形式:
len(obj='hello')# The "obj" keyword argument impairs readability
另一个益处是将形参标记为仅限位置形参将允许在未来修改形参名而不会破坏客户的代码。 例如,在 statistics 模块中,形参名 dist 在未来可能被修改。 这使得以下函数描述成为可能:
defquantiles(dist,/,*,n=4,method='exclusive')...
由于在 / 左侧的形参不会被公开为可用关键字,其他形参名仍可在 **kwargs 中使用:
>>>
>>> deff(a,b,/,**kwargs):... print(a,b,kwargs)...>>> f(10,20,a=1,b=2,c=3)# a and b are used in two ways10 20 {'a': 1, 'b': 2, 'c': 3}
这极大地简化了需要接受任意关键字参数的函数和方法的实现。 例如,以下是一段摘自 collections 模块的代码:
classCounter(dict):def__init__(self,iterable=None,/,**kwds):# Note "iterable" is a possible keyword argument
请参阅 PEP 570 了解详情。
(由 Pablo Galindo 在 bpo-36540 中贡献。)
用于已编译字节码文件的并行文件系统缓存
新增的 PYTHONPYCACHEPREFIX 设置 (也可使用 -X pycache_prefix) 可将隐式的字节码缓存配置为使用单独的并行文件系统树,而不是默认的每个源代码目录下的 __pycache__ 子目录。
缓存的位置会在 sys.pycache_prefix 中报告 (None 表示默认位置即 __pycache__ 子目录)。
(由 Carl Meyer 在 bpo-33499 中贡献。)
调试构建使用与发布构建相同的 ABI
Python 现在不论是以发布模式还是调试模式进行构建都将使用相同的 ABI。 在 Unix 上,当 Python 以调试模式构建时,现在将可以加载以发布模式构建的 C 扩展和使用稳定版 ABI 构建的 C 扩展。
发布构建和调试构建现在都是 ABI 兼容的:定义 Py_DEBUG 宏不会再启用 Py_TRACE_REFS 宏,它引入了唯一的 ABI 不兼容性。 Py_TRACE_REFS 宏添加了 sys.getobjects() 函数和 PYTHONDUMPREFS 环境变量,它可以使用新的 ./configure --with-trace-refs 构建选项来设置。 (由 Victor Stinner 在 bpo-36465 中贡献。)
在 Unix 上,C 扩展不会再被链接到 libpython,但 Android 和 Cygwin 例外。 现在静态链接的 Python 将可以加载使用共享库 Python 构建的 C 扩展。 (由 Victor Stinner 在 bpo-21536 中贡献。)
在 Unix 上,当 Python 以调试模式构建时,导入操作现在也会查找在发布模式下编译的 C 扩展以及使用稳定版 ABI 编译的 C 扩展。 (由 Victor Stinner 在 bpo-36722 中贡献。)
要将 Python 嵌入到一个应用中,必须将新增的 --embed 选项传给 python3-config --libs --embed 以获得 -lpython3.8 (将应用链接到 libpython)。 要同时支持 3.8 和旧版本,请先尝试 python3-config --libs --embed 并在此命令失败时回退到 python3-config --libs (即不带 --embed)。
增加一个 pkg-config python-3.8-embed 模块用来将 Python 嵌入到一个应用中: pkg-config python-3.8-embed --libs 包含 -lpython3.8。 要同时支持 3.8 和旧版本,请先尝试 pkg-config python-X.Y-embed --libs 并在此命令失败时回退到 pkg-config python-X.Y --libs (即不带 --embed) (请将 X.Y 替换为 Python 版本号)。
另一方面,pkg-config python3.8 --libs 不再包含 -lpython3.8。 C 扩展不可被链接到 libpython (但 Android 和 Cygwin 例外,这两者的情况由脚本处理);此改变是故意被设为向下不兼容的。 (由 Victor Stinner 在 bpo-36721 中贡献。)
f-字符串支持 = 用于自动记录表达式和调试文档
增加 = 说明符用于 f-string。 形式为 f'{expr=}' 的 f-字符串将扩展表示为表达式文本,加一个等于号,再加表达式的求值结果。 例如:
>>>
>>> user='eric_idle'>>> member_since=date(1975,7,31)>>> f'{user=} {member_since=}'"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
通常的 f-字符串格式说明符 允许更细致地控制所要显示的表达式结果:
>>>
>>> delta=date.today()-member_since>>> f'{user=!s} {delta.days=:,d}''user=eric_idle delta.days=16,075'
= 说明符将输出整个表达式,以便详细演示计算过程:
>>>
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')theta=30 cos(radians(theta))=0.866
(由 Eric V. Smith 和 Larry Hastings 在 bpo-36817 中贡献。)
PEP 578: Python 运行时审核钩子
此 PEP 添加了审核钩子和已验证开放钩子。 两者在 Python 与本机代码中均可用。允许以纯 Python 代码编写的应用和框架利用额外的通知,同时允许嵌入开发人员或系统管理员部署始终启用审核的 Python 版本。
请参阅 PEP 578 了解详情。
PEP 587: Python 初始化配置
PEP 587 增加了一个新的 C API 用来配置 Python 初始化,提供对整个配置过程的更细致控制以及更好的错误报告。
新的结构:
新的函数:
PyPreConfig_InitIsolatedConfig()
PyPreConfig_InitPythonConfig()
Py_PreInitializeFromBytesArgs()
此 PEP 还为这些内部结构添加了 _PyRuntimeState.preconfig (PyPreConfig 类型) 和 PyInterpreterState.config (PyConfig 类型) 字段。 PyInterpreterState.config 成为新的引用配置,替代全局配置变量和其他私有变量。
请参阅 Python 初始化配置 获取详细文档。
请参阅 PEP 587 了解详情。
(由 Victor Stinner 在 bpo-36763 中贡献。)
Vectorcall: 用于 CPython 的快速调用协议
添加 "vectorcall" 协议到 Python/C API。 它的目标是对已被应用于许多类的现有优化进行正式化。 任何实现可调用对象的扩展类型均可使用此协议。
此特性目前为暂定状态,计划在 Python 3.9 将其完全公开。
请参阅 PEP 590 了解详情。
(由 Jeroen Demeyer 和 Mark Shannon 在 bpo-36974 中贡献。)
具有外部数据缓冲区的 pickle 协议 5
当使用 pickle 在 Python 进程间传输大量数据以充分发挥多核或多机处理的优势时,非常重要一点是通过减少内存拷贝来优化传输效率,并可能应用一些定制技巧例如针对特定数据的压缩。
pickle 协议 5 引入了对于外部缓冲区的支持,这样 PEP 3118 兼容的数据可以与主 pickle 流分开进行传输,这是由通信层来确定的。
请参阅 PEP 574 了解详情。
(由 Antoine Pitrou 在 bpo-36785 中贡献。)
网友评论