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

时间:2020-07-03 23:27:28

标签: python python-3.x type-hinting

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

我尝试使用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'>}

4 个答案:

答案 0 :(得分:1)

提示仅在类级别存在-在创建实例时,其属性的类型将是为其分配的任何值的类型。您可以使用内置的type()函数的第一种形式来获取任何实例属性的类型,例如type(foo_instance.var)

答案 1 :(得分:0)

此信息不是evaluated,仅存在于源代码中。 如果必须获取此信息,则可以使用ast模块并在有权访问源代码的情况下自己从源代码中提取information

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

答案 2 :(得分:0)

也许这是黑客,您必须是实例的创建者,但是在某些情况下,使用数据类将为您提供所需的东西;

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'>}

答案 3 :(得分:0)

我只是遇到了同样的问题。 python doc尚不清楚,因为该示例使用的是现在正式称为数据类的数据。

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()来获取它们,并在以后的实例化中对其进行分配。