在定义带有注解字段的类/模块时,如何像在函数中那样获取注解?
class Test:
def __init__(self):
self.x : int
t = Test()
现在我需要来自getattr(t,'x')
的'int'
最佳答案
使用基线 Python,没有选项可以在不更改 Test
定义的情况下执行您想要的操作。最简单的更改是在类级别注释属性:
class Test:
x: int
def __init__(self):
# define self.x or not, but it needn't be annotated again
这实际上很好; 默认情况下,类范围内的注释被假定为引用实例属性,而不是类属性(在类范围内分配一个值会创建一个类属性,但注释它没有);你必须明确 use typing.ClassVar
指示带注释的类型仅用作类属性。 PEP 526's section on class and instance variable annotations定义这些行为;它们是您可以信赖的东西,而不仅仅是实现的意外。
完成此操作后,typing.get_type_hints
在您的示例中,将为 Test
和 t
返回 {'x': int}
。
虽然这本身就足够了,但我会注意到,在如今的许多此类情况下,只要您无论如何都在进行注释,就可以使用 the dataclasses
module 来简化代码。 ,只需最少的输入即可获得为您定义的注释和基本功能。您的案例的简单替换代码是:
import dataclasses
@dataclasses.dataclass
class Test:
x: int
虽然您的案例没有展示完整的功能集(它基本上只是用装饰器替换了 __init__
),但它的作用仍然比看上去的要多。除了为您定义 __init__
(它期望接收一个 x
参数,该参数被注释为 int
),以及一个合适的__repr__
和 __eq__
,您可以轻松定义默认值(只需在注释点分配默认值,或者对于更复杂或可变的情况,分配一个 dataclasses.field
代替),并且您可以将参数传递给 dataclass
以使其生成可排序或不可变的实例。
在您的情况下,主要优势是消除冗余; x
仅被注释和引用一次,而不是在类级别被注释一次,然后在初始化期间使用(并且可选地再次注释)。
关于python - 如何获取Python变量注解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56968086/