解析Python模块文档字符串

4 投票
1 回答
4531 浏览
提问于 2025-04-17 12:03

可以用AST来解析模块级别的文档字符串吗?

我正在做一个Python文档生成工具,地址在这里。在访问模块的标记并试图获取文档时,发现无法得到模块级别的文档字符串。到目前为止,我只能通过导入模块来获取它的__doc__,或者使用inspect模块来获取文档。

我查看了pydoc模块的源代码,想找找其他文档生成工具是怎么解析文档字符串的,结果发现pydoc也基本上需要做和我的工具一样的事情,才能获取模块级别的字符串。

我是不是漏掉了什么?解析模块级别的文档字符串的唯一方法就是实际导入模块吗?还是说可以直接从AST中解析出文档字符串?

1 个回答

5

也许我理解错了问题,但你难道不能这样做吗(python 2.7.1)?

测试文件:

"""
DOC STRING!!
"""

def hello():
    'doc string'
    print 'hello'

hello()

交互式会话:

>>> M = ast.parse(''.join(open('test.py')))
>>> ast.get_docstring(M)
'DOC STRING!!'

你还可以遍历抽象语法树,寻找文档字符串应该在的位置。

>>> M._fields
('body',)
>>> M.body
[<_ast.Expr object at 0x10e5ac710>, <_ast.FunctionDef object at 0x10e5ac790>, <_ast.Expr object at 0x10e5ac910>]
>>> # doc would be in the first slot
>>> M.body[0]._fields
('value',)
>>> M.body[0].value
<_ast.Str object at 0x10e5ac750>
>>> # it contains a string object, so maybe it's the doc string
>>> M.body[0].value._fields
('s',)
>>> M.body[0].value.s
'\nDOC STRING!!\n'

撰写回答