假设下面的类定义,
import typing
from dataclasses import dataclass
T1 = typing.TypeVar('T1')
T2 = typing.TypeVar('T2')
@dataclass
class Test(Generic[T1, T2]):
some_property: T2
some_other_property: T1我希望获得这个类的特定绑定版本的类型提示,例如
# I would like to get back: {'some_property': str, 'some_other_property': int}
hints = typing.get_type_hints(Test[int,str])不幸的是,这在Python3.9中不起作用,引发了一个类型错误"Testint,str is not a module,class,method or function“。现在,我可以做像这样的事情
hints = typing.get_type_hints(typing.get_origin(Test[int,str]))但是,在这种情况下,some_property和some_other_properties作为TypeVars返回,而不是作为特定绑定类型(int和str)返回。
手动绑定这些似乎有点麻烦;Testint的类型是typing._GenericAlias,它似乎有一个属性__ args __,它是int,str。从理论上讲,我可以尝试按照它们在get_type_hints(get_origin())中首次出现的顺序将它们绑定回类型变量,但我不确定这是否可靠。
有没有get_type_hints的等价物可以返回完全绑定的类型提示?或任何合理的其他方式来做这件事?
发布于 2021-03-29 04:00:47
我升级到了3.9.2,它并没有为我解决这个问题。
typing.get_type_hints()可以做的范围似乎是有限制的。我觉得这很奇怪,这种类型构造在其他场景中似乎不是问题。一些快速测试发现,作为另一个类类型的子类,它可以很好地处理您的Test类型。
我修改了您的示例,创建了一个新函数my_type_hints(),它使用提供的类型动态创建了一个临时类对象,作为它唯一的子元素。
我相信下面的方法可以解决你的问题。我不知道这是不是一个全面的解决方案,但我相信它可能比深入研究__args__、__origin__等更健壮。
from typing import Any, Generic, get_type_hints, TypeVar
from dataclasses import dataclass
T1 = TypeVar('T1')
T2 = TypeVar('T2')
@dataclass
class Test ( Generic[T1,T2] ):
some_property: T2
some_other_property: T1
def my_type_hints ( obj: Any ) -> Any:
class X:
x: obj
return get_type_hints ( X )['x']
hints = my_type_hints ( Test[int,str] )
print ( f'{hints=}' )https://stackoverflow.com/questions/65560252
复制相似问题