首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型类型的get_type_hints

泛型类型的get_type_hints
EN

Stack Overflow用户
提问于 2021-01-04 17:21:14
回答 1查看 197关注 0票数 2

假设下面的类定义,

代码语言:javascript
复制
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

我希望获得这个类的特定绑定版本的类型提示,例如

代码语言:javascript
复制
# 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“。现在,我可以做像这样的事情

代码语言:javascript
复制
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的等价物可以返回完全绑定的类型提示?或任何合理的其他方式来做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-29 04:00:47

我升级到了3.9.2,它并没有为我解决这个问题。

typing.get_type_hints()可以做的范围似乎是有限制的。我觉得这很奇怪,这种类型构造在其他场景中似乎不是问题。一些快速测试发现,作为另一个类类型的子类,它可以很好地处理您的Test类型。

我修改了您的示例,创建了一个新函数my_type_hints(),它使用提供的类型动态创建了一个临时类对象,作为它唯一的子元素。

我相信下面的方法可以解决你的问题。我不知道这是不是一个全面的解决方案,但我相信它可能比深入研究__args____origin__等更健壮。

代码语言:javascript
复制
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=}' )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65560252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档