是否可以在 Python 3 中获取类型化 class 属性 的 DocString?

Is it possible to get the DocString of a typed class property in Python 3?

我正在弄乱 Python 3 中的 typing 模块,看看我可以将它扩展到 DSL 多远。为了使这个 DSL 可用,我想提取一些用户定义的 DocStrings 类,比如这个:

class MyRecord:
    """
    This is just a foo.

    Wouldn't it be cool if you could extract this DocString's text at runtime?
    """
    foo: str

我一直在搜索并找到了 PEP 526,但它并没有告诉我关于在这种情况下使用 DocStrings 的任何信息。我能找到的唯一信息是关于如何在 DocString 中嵌入类型信息,但这不是我想要的。

FWIW,Python 在提供上述示例时不会抱怨。但是,它似乎也没有填充 __doc__ 属性。我是否正确地假设这目前不是标准的一部分,因此不受支持?

更新: 我在解释我想要实现的目标方面做得很糟糕。我发布了一个包含更好示例的答案:

class MyRecord:
    foo: str
    """
    This is a foo.
    """
    bar: str
    """
    This is a bar.
    """

不出所料,在当前规范中无法访问此数据。唯一的解决方案是解析 AST 并使用例如从那里提取它inspect.getsource().

可以使用 help(obj) 内置的 inspect.get_doc(obj)obj.__doc__.

从任何 python 对象中提取文档字符串
import inspect

class MyRecord:
    """
    This is just a foo.

    Wouldn't it be cool if you could extract this DocString's text at runtime?
    """
    foo: str

>>> inspect.getdoc(MyRecord)
"This is just a foo.\n\nWouldn't it be cool if you could extract this DocString's text at runtime?"

可以在运行时使用类型模块读取类型提示:

(import typing)
>>> typing.get_type_hints(MyRecord)
{'foo': str}

好吧,我真是太蠢了。当然,示例中的第一个 DocString 是 class DocString,并且永远不会与 method/property.

相关联

这本来是一个更好的例子:

class MyRecord:
    foo: str
    """
    This is a foo.
    """
    bar: str
    """
    This is a bar.
    """

但不幸的是,这在当前的 CPython 实现中是不可访问的,而且我不确定它是否会。