Python 3.11 编程语言发布

经过一年的开发,Python 3.11 编程语言的重要版本已经发布。 新分支将获得一年半的支持,在此之后的三年半内,将为其生成修复程序以消除漏洞。

与此同时,Python 3.12分支的alpha测试开始(根据新的开发时间表,新分支的工作在上一个分支发布前五个月开始,并在下一个版本发布时达到alpha测试阶段)。 Python 3.12 分支将发布为期七个月的 alpha 版本,在此期间将添加新功能并修复错误。 此后,Beta版本将进行为期三个月的测试,在此期间将禁止添加新功能,并将全部精力集中在修复错误上。 在发布前的最后两个月,该分支将处于发布候选阶段,在此阶段将进行最终的稳定。

Python 3.11 的新增内容包括:

  • 为了优化性能,我们已经做了大量的工作。 新分支包括与函数调用的加速和内联部署、标准操作的快速解释器的使用(x+x、x*x、xx、a[i]、a[i] = z、f(arg) C( arg)、o.method()、o.attr = z、*seq),以及 Cinder 和 HotPy 项目准备的优化。 根据负载类型的不同,代码执行速度可提高 10-60%。 平均而言,pyperformance 测试套件的性能提高了 25%。

    字节码缓存机制经过重新设计,解释器启动时间减少了10-15%。 具有代码和字节码的对象现在由解释器静态分配,这使得消除从缓存中提取的解组字节码以及转换具有代码的对象以放置在动态内存中的阶段成为可能。

  • 在诊断消息中显示调用跟踪时,现在可以显示有关导致错误的表达式的信息(以前,仅突出显示该行,而没有详细说明该行的哪一部分导致了错误)。 还可以通过 API 获取扩展跟踪信息,并使用 codeobject.co_positions() 方法或 C API 函数 PyCode_Addr2Location() 将各个字节码指令映射到源代码中的特定位置。 这一更改使得调试嵌套字典对象、多个函数调用和复杂算术表达式的问题变得更加容易。 回溯(最近一次调用):文件“calculation.py”,第 54 行,结果 = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError:除以零
  • 添加了对异常组的支持,使程序能够同时生成和处理多个不同的异常。 为了对多个异常进行分组并将它们一起引发,提出了新的异常类型 ExceptionGroup 和 BaseExceptionGroup,并且添加了“ except*”表达式以突出显示组中的各个异常。
  • BaseException 类中添加了 add_note() 方法,允许您将文本注释附加到异常,例如,添加抛出异常时不可用的上下文信息。
  • 添加了一个特殊的 Self 类型来表示当前的私有类。 Self 可用于以比使用 TypeVar 更简单的方式注释返回其类实例的方法。 class MyLock: def __enter__(self) -> Self: self.lock() return self
  • 添加了特殊的 LiteralString 类型,该类型只能包含与 LiteralString 类型兼容的字符串文字(即裸字符串和 LiteralString 字符串,但不能包含任意或组合的 str 字符串)。 LiteralString 类型可用于限制向函数传递字符串参数、任意替换可能导致漏洞的字符串部分,例如,在为 SQL 查询或 shell 命令生成字符串时。 def run_query(sql: LiteralString) -> ... ... def caller(任意_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query("SELECT * FROM Students") # ok run_query(literal_string) # 好的 run_query( "SELECT * FROM" + Literal_string) # 好的 run_query(任意字符串) # 错误 run_query( # 错误 f"SELECT * FROM Students WHERE name = {任意_string}" )
  • 添加了 TypeVarTuple 类型,允许使用变量泛型,这与 TypeVar 不同,TypeVar 涵盖的不是一种类型,而是任意数量的类型。
  • 标准库包括 tomllib 模块,该模块具有解析 TOML 格式的函数。
  • 可以使用“Required”和“NotRequired”标签来标记类型字典 (TypedDict) 的各个元素,以确定必需字段和可选字段(默认情况下,如果总参数未设置为 False,则所有声明的字段都是必需的)。 class Movie(TypedDict): title: stryear: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK(年份字段是可选的) m3: Movie = {“year”: 2022} # 错误,必填标题字段没有填写)
  • TaskGroup 类已添加到 asyncio 模块中,并实现了等待一组任务完成的异步上下文管理器。 使用 create_task() 方法将任务添加到组中。 async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("两个任务现在都已完成”)
  • 为类、方法和函数添加了 @dataclass_transform 装饰器,指定时,静态类型检查系统将对象视为使用 @dataclasses.dataclass 装饰器。 在下面的示例中,CustomerModel 类在检查类型时,将与带有 @dataclasses.dataclass 装饰器的类类似地进行处理,即因为有一个接受 id 和 name 变量的 __init__ 方法。 @dataclass_transform() 类 ModelBase: ... 类 CustomerModel(ModelBase): id: int 名称: str
  • 在正则表达式中,添加了使用原子分组 ((?>...)) 和所有格量词 (*+、++、?+、{m,n}+) 的功能。
  • 添加了“-P”命令行选项和 PYTHONSAFEPATH 环境变量,以禁用将潜在不安全的文件路径自动附加到 sys.path。
  • Windows 平台的 py.exe 实用程序已得到显着改进,添加了对“-V:”语法的支持。 / “ 此外 ”- 。 ”
  • C API 中的许多宏都被转换为常规或静态内联函数。
  • uu、cgi、pipes、crypt、aifc、chunk、msilib、telnetlib、audioop、nis、sndhdr、imghdr、nntplib、spwd、xdrlib、cgitb、mailcap、ossaudiodev 和 sunau 模块已被弃用,并将在 Python 中删除3.13 发布。 删除了 PyUnicode_Encode* 函数。

来源: opennet.ru

添加评论