5

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

我试过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

4 回答 4

4

我只是有同样的问题。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()基于函数而不是类返回提示。这样,如果我们知道的话,它可以与两者一起使用。一个普通的类显然没有在它的声明中被实例化,它没有在__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()稍后在实例化中获取并分配它们。

于 2020-11-22T07:55:17.167 回答
1

此信息未经评估,仅存在于源代码中。如果您必须获取此信息,您可以使用ast模块并自己从源代码中提取信息(如果您可以访问源代码)。

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

于 2020-07-05T01:11:02.487 回答
1

也许这是一个 hack,你必须是你的实例的创建者,但在某些情况下,使用数据类可以得到你想要的;

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'>}
于 2020-10-26T18:16:53.323 回答
1

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

于 2020-07-03T23:53:15.063 回答