【问题标题】:Finding type hint name of dataclass attributes [duplicate]查找数据类属性的类型提示名称[重复]
【发布时间】:2021-02-23 10:07:44
【问题描述】:

我有一个带有类型属性的数据类,使用我定义的类型,如下所示:

from dataclasses import dataclass

PositiveFloatType = NewType("PositiveFloat", float)

@dataclass(init=False, frozen=True)
class Foo:
    bar: PositiveFloatType = 1

在运行时,我想获得 Foo.bar 的类型。即,我想查找 Foo 类的所有属性,并知道它们的类型名称,如果是 Foo.bar - 获取“PositiveFloatType”。

我尝试使用inspect 无济于事。有没有办法做到这一点?

【问题讨论】:

    标签: python python-typing python-dataclasses


    【解决方案1】:

    这就是dataclasses 模块提供fields 函数的目的:

    from dataclasses import fields
    
    for f in fields(Foo):
        print(f.name, f.type.__name__)
    

    【讨论】:

    • 只是一个警告,如果你在任何地方使用from __future__ import annotationsf.type 将是一个字符串。
    • 不是任何地方,而是在定义数据类的那个文件中。是的,因为这很快就会成为默认行为,所以你的代码应该会这样。
    • 绝对正确,感谢您的澄清
    【解决方案2】:

    作为替代方案,考虑到f.type 可以是字符串这一事实,我假设您实际上想要具体的类对象。

    from typing import Any, Type, get_type_hints
    
    def get_field_type(data_class: Type[Any], field_name: str) -> Type[Any]:
       return get_type_hints(data_class)[field_name]   
    

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 2012-09-08
      • 2013-02-10
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2019-02-20
      • 2021-05-26
      相关资源
      最近更新 更多