是否可以在 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 实现中是不可访问的,而且我不确定它是否会。
我正在弄乱 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__
.
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 实现中是不可访问的,而且我不确定它是否会。