Python 3.11 有什么新变化 - 新功能&新模块

新功能

PEP 657:回溯中的细粒度错误位置

打印回溯时,解释器现在将指向确切的表达式 这导致了错误,而不仅仅是行。例如:

Traceback (most recent call last):
  File "distance.py", line 11, in <module>
    print(manhattan_distance(p1, p2))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "distance.py", line 6, in manhattan_distance
    return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                           ^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'

以前版本的解释器将仅指向该行,使其 模棱两可的哪个对象是.这些增强的错误也很有帮助 处理深度嵌套对象和多个函数调用时:None

Traceback (most recent call last):
  File "query.py", line 37, in <module>
    magic_arithmetic('foo')
  File "query.py", line 18, in magic_arithmetic
    return add_counts(x) / 25
           ^^^^^^^^^^^^^
  File "query.py", line 24, in add_counts
    return 25 + query_user(user1) + query_user(user2)
                ^^^^^^^^^^^^^^^^^
  File "query.py", line 32, in query_user
    return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                               ~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable

以及复杂的算术表达式:

Traceback (most recent call last):
  File "calculation.py", line 54, in <module>
    result = (x / y / z) * (a / b / c)
              ~~~~~~^~~
ZeroDivisionError: division by zero

此外,增强的回溯功能使用的信息 通过通用 API 提供,可用于将字节码指令与源代码位置相关联。 可以使用以下方法检索此信息:

Python 中的方法。

C API 中的函数。

有关更多详细信息,请参阅 PEP 657。(由Pablo Galindo,Batuhan Taskaya提供 和 bpo-43950 中的阿马尔·阿斯卡尔。

备注 此功能需要在代码对象中存储列位置, 这可能会导致口译员内存使用量略有增加 以及已编译的 Python 文件的磁盘使用情况。 避免存储额外信息 并停用打印额外的回溯信息, 使用命令行选项 或环境变量。

PEP 654:例外组和except*

PEP 654 引入了启用程序的语言功能 同时引发和处理多个不相关的异常。 内置类型,并可以对异常进行分组并一起引发, 新语法泛化以匹配异常组的子组。

有关更多详细信息,请参阅 PEP 654。

(由Irit Katriel在bpo-45292中提供。PEP撰写者 Irit Katriel,Yury Selivanov和Guido van Rossum。

PEP 678:可以使用注释丰富异常
该方法将添加到 中。 它可用于使用上下文信息丰富异常 这在引发异常时不可用。 添加的注释将显示在默认回溯中。

有关更多详细信息,请参阅 PEP 678。

(由Irit Katriel在bpo-45607中提供。 PEP由Zac Hatfield-Dodds撰写。

窗口启动器改进py.exe
适用于Windows的Python启动器的副本包含在Python 3.11中已经显着 更新。它现在支持使用 PEP 514 中定义的公司/标签语法,使用参数而不是有限的 . 这允许启动除 以外的发行版。 托管在 python.org 上的那个。-V:/-.PythonCore

使用选择器时,可以省略公司或标签,但所有 将搜索安装。例如,将选择 注册了“最佳”标签,而 或 将选择带有标签的“最佳”分布。-V:-V:OtherPython/OtherPython-V:3.11-V:/3.113.11

使用旧版 、 或参数时, 所有现有行为都应保留过去的版本, 并且仅选择以下版本。 但是,后缀现在意味着“不是 32 位”(不一定是 x86-64), 因为有多个受支持的 64 位平台。 32 位运行时是通过检查运行时标记的后缀来检测的。 自 3.5 以来的所有 Python 版本都已将其包含在 32 位版本中。--.---.-PythonCore-64-32

与类型提示相关的新功能
本节介绍影响 PEP 484 类型提示的主要更改,以及 模块。

PEP 646:可变参数泛型

之前引入的 PEP 484 ,支持创建 使用单一类型参数化的泛型。PEP 646 添加 ,启用参数化 具有任意数量的类型。换句话说, a 是一个可变参数类型变量, 启用可变参数泛型。

这支持各种各样的用例。 特别是,它允许类似数组的结构的类型 在数值计算库中,如NumPy和TensorFlow是 使用数组形状进行参数化。静态类型检查器现在将 能够在使用这些库的代码中捕获与形状相关的错误。

有关更多详细信息,请参阅 PEP 646。

(由Matthew Rahtz在bpo-43224中提供,贡献者为 Serhiy Storchaka 和 Jelle Zijlstra。PEP作者:Mark Mendoza,Matthew Rahtz、Pradeep Kumar Srinivasan和Vincent Siles。

PEP 655:将单个项目标记为必需或非必需TypedDict
并提供 直接标记 a 中的各个项目是否必须存在。以前,这只能实现 使用继承。

默认情况下,所有字段仍然是必填字段, 除非 total 参数设置为 , 在这种情况下,默认情况下仍然不需要所有字段。 例如,下面指定 具有一个必需键和一个非必需键的 :FalseTypedDict

class Movie(TypedDict):
   title: str
   year: NotRequired[int]

m1: Movie = {"title": "Black Panther", "year": 2018}  # OK
m2: Movie = {"title": "Star Wars"}  # OK (year is not required)
m3: Movie = {"year": 2022}  # ERROR (missing required field title)
以下定义是等效的:

class Movie(TypedDict, total=False):
   title: Required[str]
   year: int

有关更多详细信息,请参阅 PEP 655。

(由David Foster和Jelle Zijlstra在bpo-47087中提供。政治人物 大卫·福斯特撰写。

PEP 673:类型Self

新的注释提供了简单直观的 对返回其类实例的方法进行批注的方法。这 行为与 PEP 484 中指定的基于 -的方法相同, 但更简洁,更容易遵循。

常见用例包括以 s 形式提供的替代构造函数, 和返回的方法:self

class MyLock:
    def __enter__(self) -> Self:
        self.lock()
        return self

    ...

class MyInt:
    @classmethod
    def fromhex(cls, s: str) -> Self:
        return cls(int(s, 16))

    ...

也可用于注释方法参数 或与其封闭类类型相同的属性。

有关更多详细信息,请参阅 PEP 673。

(由James Hilton-Balfe在bpo-46534中提供。PEP撰写者 Pradeep Kumar Srinivasan和James Hilton-Balfe。

PEP 675:任意文本字符串类型

新注释可用于指示 函数参数可以是任何文本字符串类型。这允许 接受任意文本字符串类型以及字符串的函数 从其他文本字符串创建。然后,类型检查器可以 强制执行敏感函数,例如执行 SQL 的函数 语句或 shell 命令,仅使用静态参数调用, 提供针对注入攻击的保护。

例如,可以按如下方式批注 SQL 查询函数:

def run_query(sql: LiteralString) -> ...
    ...

def caller(
    arbitrary_string: str,
    query_string: LiteralString,
    table_name: LiteralString,
) -> None:
    run_query("SELECT * FROM students")       # ok
    run_query(query_string)                   # ok
    run_query("SELECT * FROM " + table_name)  # ok
    run_query(arbitrary_string)               # type checker error
    run_query(                                # type checker error
        f"SELECT * FROM students WHERE name = {arbitrary_string}"
    )

有关更多详细信息,请参阅 PEP 675。

(由Jelle Zijlstra在bpo-47088中提供。普拉迪普撰写的PEP 库马尔·斯里尼瓦桑和格雷厄姆·布莱尼。

PEP 681:数据类转换

可用于 修饰类、元类或本身就是修饰器的函数。 的存在告诉静态类型检查器 装饰对象执行转换类的运行时“魔术”, 赋予它类似的行为。@dataclass_transform()

例如:

# The create_model decorator is defined by a library.
@typing.dataclass_transform()
def create_model(cls: Type[T]) -> Type[T]:
    cls.__init__ = ...
    cls.__eq__ = ...
    cls.__ne__ = ...
    return cls

# The create_model decorator can now be used to create new model classes:
@create_model
class CustomerModel:
    id: int
    name: str

c = CustomerModel(id=327, name="Eric Idle")

有关更多详细信息,请参阅 PEP 681。

(由Jelle Zijlstra在gh-91860中提供。PEP撰写者 埃里克·德邦特和埃里克·特劳特。

PEP 563可能不是未来

PEP 563推迟的批注评估 (未来声明) 最初计划在 Python 3.10 中发布 已被无限期搁置。 有关更多信息,请参阅指导委员会的此消息。from future import annotations

其他语言更改
带星标的解压缩表达式现在可以在语句中使用。 (有关更多详细信息,请参阅 bpo-46725。

现在允许异步推导 异步函数中的内部推导。 在这种情况下,外部推导隐式变为异步。 (由Serhiy Storchaka在bpo-33346中提供。

现在引发 a 而不是 in 语句,对于不支持上下文管理器协议的对象, 以及在语句中和不支持异步上下文管理器协议的对象中。 (由Serhiy Storchaka在bpo-12022和bpo-44471中提供。

添加了 ,它提供了默认值 方法的实现。正在 和内置类型的子类的实例, , , , , , 现在复制和 作为槽实现的 pickles 实例属性。 (由Serhiy Storchaka在bpo-26579中提供。getstate()

添加了命令行选项 和一个环境变量, 在运行脚本时禁用脚本目录的自动预置, 或使用 和 时的当前目录。 这可确保仅 stdlib 和已安装的模块 被 , 并避免无意或恶意地隐藏模块 与本地(通常是用户可写的)目录中的那些。 (由 Victor Stinner 在 gh-57684 中提供。

在格式规格迷你语言中添加了一个选项, 舍入到格式精度后,强制负零为正零。 有关更多详细信息,请参阅 PEP 682。 (由John Belmonte在gh-90153中提供。“z”

上不再接受字节。支持在某个时候中断 在 Python 3.2 和 3.6 之间,直到 Python 3.10.0 之后才有人注意到 被释放。此外,由于以下原因,恢复支持将是有问题的 之间的交互和时间 有和键的混合。 (由Thomas Grainger在gh-91181中提供。

其他CPython实施更改
实施 for 和 for 的特殊方法以支持 和协议。 (由Mark Dickinson和Dong-hee Na在bpo-24234中提供。

siphash13作为新的内部哈希算法添加。 它具有与 类似的安全属性。 但对于长输入,它的速度略快。、 和其他一些类型 现在将其用作 的默认算法。PEP 552 基于哈希的 .pyc 文件现在也使用。 (由Inada Naoki在bpo-29410中提供。siphash24siphash13

当没有参数的语句重新引发活动异常时, 附加到此异常的回溯现在始终为 。 这意味着对当前子句中的回溯所做的更改是 反映在重新提出的例外中。 (由 Irit Katriel 在 bpo-45711 中提供。sys.exc_info()[1].traceback

解释器状态对已处理异常的表示形式 (又名或 ) 现在只有字段; 并且已被删除,因为它们可以从 派生。 (由 Irit Katriel 在 bpo-45711 中提供。exc_info_PyErr_StackItemexc_valueexc_typeexc_tracebackexc_value

新的命令行选项, 已为 Windows 安装程序添加。 它的行为类似于 , 但附加安装和脚本目录,而不是在它们前面添加它们。 (由Bastian Neuburger在bpo-44934中提供。AppendPathPrependPath

现在必须将该字段设置为 用于初始化 的初始化。否则,初始化将重新计算路径并替换 添加到 的任何值。1module_search_paths

该选项的输出现在适合 50 行/80 列。 有关 Python 环境变量和选项的信息现在可以使用相应的 和 标志, 和新的. (由Éric Araujo在bpo-46142中提供。

在 2 以外的基数之间和在基数之间进行转换 (二进制)、4、8(八进制)、16(十六进制)或 32,例如以 10 为底(十进制) 现在,如果字符串形式的位数为 超过限制以避免由于 算法复杂性。这是针对 CVE-2020-10735 的缓解措施。 此限制可以通过环境变量、命令配置或禁用 行标志或 API。查看整数字符串转换 长度限制文档。默认限制 是字符串形式的 4300 位数字。

新模块

:用于解析 TOML。 有关更多详细信息,请参阅 PEP 680。 (由Taneli Hukkinen在bpo-40059中提供。

:用于静态类型检查的特定于 WSGI 的类型。 (由Sebastian Rittau在bpo-42012中提供。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值