Python 打字中的 `typing._GenericAlias` 是什么?

问题描述 投票:0回答:1
import typing
assert type(typing.List[int]) == typing._GenericAlias
assert type(list[int]) == typing.GenericAlias

我在python官方文档中找不到

typing._GenericAlias
的定义。
typing._GenericAlias
typing.GenericAlias
有什么区别?

python python-3.x python-typing
1个回答
0
投票

预期用途

_GenericAlias
typing
模块内部使用,而
GenericAlias
是供最终用户使用的公共功能。

定义

_GenericAlias
typing
模块中的一个类,而
GenericAlias
是使用像
list[int]
这样的参数化泛型类型动态创建的。


class typing._GenericAlias(_BaseGenericAlias, _root=True)
- 来源

  • 目的

    • 它是
      typing
      模块使用的内部类,用于表示像
      List[int]
      这样的泛型类型。
    • 它处理用户定义的类型和
      typing
      模块内各种行为的特殊情况。
  • 用法

    • 此类支持用户定义类型(如
      List[int]
      )和特殊类型(如
      List
      )。
    • 它是内部使用的,并不意味着最终用户可以直接使用。
  • 来源:GitHub 问题#84577GitHub 问题#103395GitHub 问题#90747

typing.GenericAlias: type[type]
- 来源

  • 目的

    • PEP 585 引入,
      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 #101859GitHub 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
    管理。

© www.soinside.com 2019 - 2024. All rights reserved.