为什么Python 3.11不会在print(set[0])时抛出错误?

7y4bm7vi  于 2023-09-29  发布在  Python
关注(0)|答案(2)|浏览(100)

我偶然发现了Python后期版本的一个非常奇怪的行为。print(set[0])实际上会打印set[0],而不是在Python 3.9或更高版本中抛出错误。旧版本的Python不允许这样的行为。有没有人知道这是为什么?我想我今晚会睡不着的!
我希望得到一个TypeError异常,说明一个集合是不可订阅的。

gzszwxb4

gzszwxb41#

它是用于类型提示的类型别名

>>> x=set[0]
>>> type(x)
<class 'types.GenericAlias'>

这没有多大意义,因为括号之间的表达式应该是ex list[float]类型,但语法是正确的

5n0oy7gb

5n0oy7gb2#

该特性是在PEP 585 – Type Hinting Generics In Standard Collections中引入的。从Python 3.7开始,通过导入from __future__ import annotations就可以使用它。请注意,您可以使用set[0].__args__获取泛型类型参数。范例:

>>> set[0,1].__args__
(0, 1)

该特性允许将文字值作为类型参数传递,尽管PEP 585中没有记录该用例,并且一些类型检查器甚至可能会对此提出异议。

相关问题