typing
模块提供了通用类型提示的基类: typing.Generic
类。Generic
的子类在方括号中接受类型参数,例如:
list_of_ints = typing.List[int]
str_to_bool_dict = typing.Dict[str, bool]
我的问题是,如何访问这些类型参数?
也就是说,给定
str_to_bool_dict
作为输入,如何获得str
和bool
作为输出?基本上我正在寻找这样的功能
>>> 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/