python - 如何获取Python变量注解?

标签 python type-annotation

在定义带有注解字段的类/模块时,如何像在函数中那样获取注解?

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在您的示例中,将为 Testt 返回 {'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/

相关文章:

scala - 如何修复 Scala 的 WartRemover 工具中的产品类型推断错误

java - 使用 Java 7 类型注释 (JSR 308)?

python 3.7 : check if type annotation is "subclass" of generic

java-8 - 如果是 varargs 参数,@Nullable 注释引用哪里?

导入模块的Python测试和模拟

python - 在 HoloViews 中设置组合图的边界或范围

python - tkinter filedialog.askopenfilename() 窗口在 python 3 中不会关闭

python - pickle 是否在大文件上随机失败并出现 OSError?

python - 如果数据冗余,重用预建字典的有效方法是什么?深拷贝太慢

java - ASM 如何通知我有关强制转换和构造函数调用的类型注释