我想获取对象属性的类型提示。我只能得到该类的提示,而不能得到它的实例。
我尝试使用来自
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 文档不太清楚,因为该示例是用现在正式称为数据类的内容编写的。
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()
获取它们并稍后在实例化中分配它们。
也许这是一种黑客行为,您必须是实例的创建者,但在某些情况下,使用数据类可以获得您想要的东西;
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'>}
提示仅存在于类级别 - 创建实例时,其属性的类型将是分配给它们的任何值的类型。您可以使用内置
type()
函数的第一种形式来获取任何实例属性的类型 - 例如type(foo_instance.var)
。
此信息未经“评估”,仅存在于源代码中。 如果您必须获取此信息,如果您有权访问源代码,则可以使用 ast 模块并自行从源代码中提取 information。 您还应该问自己是否需要这些信息,因为在大多数情况下重新评估源代码会花费很大的精力。