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

ell*_*493 11 python type-hinting python-3.x

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

我尝试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'>}
Run Code Online (Sandbox Code Playgroud)

小智 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']
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

print(get_type_hints(foo.__init__))
Run Code Online (Sandbox Code Playgroud)

最后,对于您的确切示例,我相信您有两种选择。如果您的逻辑允许,您可以实例化一个临时对象并del在之后立即清理它。或者将您的变量声明为带有或不带有默认值的类变量,以便您可以在实例化中获取它们get_type_hints()并在稍后分配它们。


ell*_*493 1

此信息不会被评估,仅存在于源代码中。如果您必须获取此信息,如果您有权访问源代码,则可以使用ast模块并自行从源代码中提取信息

您还应该问自己是否需要此信息,因为在大多数情况下重新评估源代码会花费很多精力。