【问题标题】:How to get type annotations for class members?如何获取类成员的类型注释?
【发布时间】:2019-12-04 10:22:00
【问题描述】:

考虑以下代码:

from typing import Optional

class Foo:
    def __init__(self):
        self.baz: Optional[int] = None

如何在代码中找到 baz 类型为 Optional[int] 的代码?如果我做type(Foo().baz),我只会得到None

【问题讨论】:

  • type 不是您访问打字数据的方式,它在__annotations__ 中。但我不认为这样的方法中的注释会暴露在任何地方。通常你会将它包含在参数列表中,即(self, baz: Optional[int] = None),然后它会在Foo.__init__.__annotations__中。
  • mypy 发现它们很好,至少对于 init。我希望能够在我的代码中使用这些。

标签: python typing inspect


【解决方案1】:

您可以在类主体中定义实例属性类型,如PEP 中所述

from typing import Optional, get_type_hints

class Foo:
    baz: Optional[int]

    def __init__(self):
        self.baz = None


get_type_hints(Foo)

Out[26]: {'baz': typing.Union[int, NoneType]}

注意typing.Union[int, NoneType]Optional[int] 相同。

【讨论】:

  • 这不是也将Foo.baz定义为一个有效的变量来使用吗?
  • 除了Foo().baz,我的意思是。
  • 不,如果您在课程主体中使用baz: Optional[int] = None,就会出现这种情况。答案中的班级Foo.baz 给出了AttributeError
  • 查看链接的 PEP,其中有很多示例
  • 只要我不赋值就可以了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2012-02-10
  • 2011-05-26
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多