gpt4 book ai didi

python - 如何访问 typing.Generic 的类型参数?

转载 作者:IT老高 更新时间:2023-10-28 20:33:45 27 4
gpt4 key购买 nike

typing模块为泛型类型提示提供了一个基类:typing.Generic类。

Generic 的子类接受方括号中的类型参数,例如:

list_of_ints = typing.List[int]
str_to_bool_dict = typing.Dict[str, bool]

我的问题是,如何访问这些类型参数?

也就是说,给定 str_to_bool_dict 作为输入,我怎样才能得到 strbool 作为输出?

基本上我正在寻找这样的功能

>>> magic_function(str_to_bool_dict)
(<class 'str'>, <class 'bool'>)

最佳答案

Python >= 3.8

从 Python3.8 开始,有 typing.get_args:

print( get_args( List[int] ) ) # (<class 'int'>,)

PEP-560还提供了 __orig_bases__[n],它允许我们使用第 n 个泛型基的参数:

from typing import TypeVar, Generic, get_args

T = TypeVar( "T" )

class Base( Generic[T] ):
pass

class Derived( Base[int] ):
pass

print( get_args( Derived.__orig_bases__[0] ) ) # (<class 'int'>,)

Python >= 3.6

从 Python 3.6 开始。有一个公共(public) __args__ 和 (__parameters__) 字段。例如:

print( typing.List[int].__args__ )

这包含泛型参数(即 int),而 __parameters__ 包含泛型本身(即 ~T)。


Python < 3.6

使用 typing_inspect.getargs


一些注意事项

打字跟在PEP8之后. PEP8 和 typing 都是由 Guido van Rossum 合着的。双前导和尾随下划线定义为:“存在于用户控制的命名空间中的“魔术”对象或属性。

dunders 也被在线评论;来自 typing 的官方存储库我们可以看到:

  • "__args__ 是下标中使用的所有参数的元组,例如,Dict[T, int].__args__ == (T, int)".

但是,authors also note :

  • "typing 模块具有临时状态,因此它不受向后兼容的高标准所涵盖(尽管我们尽量保持它),对于(尚未记录的)dunder 属性尤其如此像 __union_params__。如果你想在运行时上下文中使用类型,那么你可能会对 typing_inspect 项目感兴趣(其中一部分可能会在以后键入)。 "

一般来说,无论您对 typing 做什么,都需要暂时保持最新状态。如果您需要前向兼容的更改,我建议您编写自己的注释类。

关于python - 如何访问 typing.Generic 的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48572831/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com