如何获取对象属性的类型提示?

问题描述 投票:0回答:4

我想获取对象属性的类型提示。我只能得到该类的提示,而不能得到它的实例。

我尝试使用来自

here
foo_instance.__class__,但这只显示了类变量。

那么在示例中如何获得

bar
的类型提示?

class foo:
    var: int = 42
    def __init__(self):
        self.bar: int = 2

print(get_type_hints(foo)) # returns {'var': <class 'int'>}
python python-typing
4个回答
6
投票

我也遇到了同样的问题。 python 文档不太清楚,因为该示例是用现在正式称为数据类的内容编写的。

Student(NamedTuple):
    name: Annotated[str, 'some marker']

get_type_hints(Student) == {'name': str}
get_type_hints(Student, include_extras=False) == {'name': str}
get_type_hints(Student, include_extras=True) == {
    'name': Annotated[str, 'some marker']
}

给人的印象是

get_type_hints()
直接在课堂上工作。结果
get_type_hints()
返回基于函数的提示,而不是基于类。这样它就可以与我们知道的if一起使用。一个普通的类显然没有在它的声明中被实例化,它没有在
__init__()
方法中设置任何尚未被调用的变量。如果我们希望能够从类范围的变量中获取类型提示,那也不可能是这样。

所以你可以在

__init__()
上调用它,也就是说,如果变量是在参数中传递的(是的,我看到它不在你的示例中,但可能对其他人有帮助,因为我在几个小时的搜索中没有在任何地方看到这个);

class foo:
    var: int = 42
    def __init__(self, bar: int = 2):
        self.bar = int

print(get_type_hints(foo.__init__))

最后,对于你的具体例子,我相信你有两种选择。如果您的逻辑允许,您可以实例化一个临时对象并使用

del
立即清理它。或者将您的变量声明为带有或不带有默认值的类变量,以便您可以使用
get_type_hints()
获取它们并稍后在实例化中分配它们。


4
投票

也许这是一种黑客行为,您必须是实例的创建者,但在某些情况下,使用数据类可以获得您想要的东西;

Python 3.7+

@dataclass
class Foo:
    bar: str = 2

if __name__ == '__main__':
    f = Foo()
    print(f.bar)
    print(get_type_hints(f))

2
{'bar': <class 'str'>}

1
投票

提示仅存在于类级别 - 创建实例时,其属性的类型将是分配给它们的任何值的类型。您可以使用内置

type()
函数的第一种形式来获取任何实例属性的类型 - 例如
type(foo_instance.var)


1
投票

此信息未经“评估”,仅存在于源代码中。 如果您必须获取此信息,如果您有权访问源代码,则可以使用 ast 模块并自行从源代码中提取 information 您还应该问自己是否需要这些信息,因为在大多数情况下重新评估源代码会花费很大的精力。

© www.soinside.com 2019 - 2024. All rights reserved.