我偶然发现了Python后期版本的一个非常奇怪的行为。print(set[0])实际上会打印set[0],而不是在Python 3.9或更高版本中抛出错误。旧版本的Python不允许这样的行为。有没有人知道这是为什么?我想我今晚会睡不着的!我希望得到一个TypeError异常,说明一个集合是不可订阅的。
print(set[0])
set[0]
gzszwxb41#
它是用于类型提示的类型别名
>>> x=set[0] >>> type(x) <class 'types.GenericAlias'>
这没有多大意义,因为括号之间的表达式应该是ex list[float]类型,但语法是正确的
list[float]
5n0oy7gb2#
该特性是在PEP 585 – Type Hinting Generics In Standard Collections中引入的。从Python 3.7开始,通过导入from __future__ import annotations就可以使用它。请注意,您可以使用set[0].__args__获取泛型类型参数。范例:
from __future__ import annotations
set[0].__args__
>>> set[0,1].__args__ (0, 1)
该特性允许将文字值作为类型参数传递,尽管PEP 585中没有记录该用例,并且一些类型检查器甚至可能会对此提出异议。
2条答案
按热度按时间gzszwxb41#
它是用于类型提示的类型别名
这没有多大意义,因为括号之间的表达式应该是ex
list[float]
类型,但语法是正确的5n0oy7gb2#
该特性是在PEP 585 – Type Hinting Generics In Standard Collections中引入的。从Python 3.7开始,通过导入
from __future__ import annotations
就可以使用它。请注意,您可以使用set[0].__args__
获取泛型类型参数。范例:该特性允许将文字值作为类型参数传递,尽管PEP 585中没有记录该用例,并且一些类型检查器甚至可能会对此提出异议。