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'>,)

旧答案

可能性1

从Python 3.6开始。有一个公共(public)__args__和(__parameters__)字段。
例如:
print( typing.List[int].__args__ )

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

可能性2

使用typing_inspect.getargs

使用哪个
typing跟在PEP8之后。 PEP8和typing由Guido van Rossum合着。前后双下划线定义为:“生活在用户控制的命名空间中的”魔术”对象或属性。

这些声音也被在线注释;从typing的官方存储库中,我们
可以看到:
*“__args__是用于下标的所有参数的元组,例如Dict[T, int].__args__ == (T, int)”。

但是,authors also note:
*“类型模块具有临时状态,因此它没有被高标准的向后兼容性所覆盖(尽管我们尝试尽可能地保持它),这对于__union_params__之类的dunder属性(尚未记录)尤其如此。如果想在运行时上下文中使用键入类型,那么您可能会对typing_inspect项目感兴趣(其中一部分可能会在以后进行键入)。”

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

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

10-09 13:14