import typing
assert type(typing.List[int]) == typing._GenericAlias
assert type(list[int]) == typing.GenericAlias
我在python官方文档中找不到
typing._GenericAlias
的定义。
typing._GenericAlias
和 typing.GenericAlias
有什么区别?
预期用途:
_GenericAlias
供typing
模块内部使用,而GenericAlias
是供最终用户使用的公共功能。
定义:
_GenericAlias
是typing
模块中的一个类,而GenericAlias
是使用像list[int]
这样的参数化泛型类型动态创建的。
class typing._GenericAlias(_BaseGenericAlias, _root=True)
- 来源:
目的:
typing
模块使用的内部类,用于表示像 List[int]
这样的泛型类型。typing
模块内各种行为的特殊情况。用法:
List[int]
)和特殊类型(如List
)。typing.GenericAlias: type[type]
- 来源:
目的:
GenericAlias
是一项面向公众的功能,允许直接使用内置集合类型(例如,list
、dict
)作为泛型。定义:
types
模块中,GenericAlias
定义为type(list[int])
。这种动态创建使其能够充当内置集合的通用类型。GenericAlias = type(list[int])
用法:
>>> from types import GenericAlias
>>>
>>> list_int = GenericAlias(list, (int,))
>>> print(list_int)
list[int]
来源:GitHub Issue #101859、GitHub Issue #96871、通用别名类型 - stdtype doc、通用别名 - 类型文档
为什么断言有效?
>>> import typing
>>>
>>> assert type(typing.List[int]) == typing._GenericAlias
>>> assert type(list[int]) == typing.GenericAlias
typing._GenericAlias
由 typing
模块内部使用来处理像 List[int]
这样的泛型类型。这就是为什么 type(typing.List[int])
返回 typing._GenericAlias
。引入 types.GenericAlias
是为了允许内置集合类型(如 list
、dict
)直接用作泛型(例如,list[int]
)。这就是为什么 type(list[int])
返回 types.GenericAlias
。
第一个断言确认
typing.List[int]
由 typing._GenericAlias
管理。
第二个断言确认
list[int]
由 types.GenericAlias
管理。