CPython不使用autodoc作为其文档 - 我们使用手写的散文。
对于PEP 3144(ipaddress模块),我想使用sphinx-apidoc生成初始参考文档。这意味着我想运行两遍操作:
使用sphinx-apidoc为依赖于autodoc的模块发出Sphinx项目
运行sphinx构建器,创建新的reStructuredText源文件,所有autodoc指令替换为内联reStructuredText内容和生成相同输出的标记
第一步很简单,但我不知道如何进行第二步,甚至无法想出以这些方式搜索任何现有项目的好方法。
答案 0 :(得分:9)
我遇到了同样的问题并且一次生成了文档,我使用了非常难看的解决方案来修补Sphinx,请参阅Make Sphinx generate RST class documentation from pydoc。
答案 1 :(得分:2)
不是一个完整的答案,或多或少是一个起点:
autodoc
将auto指令转换为python指令。
因此,可以使用autodoc事件来获取已翻译的python指令。
例如,如果您有以下mymodule.py
:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
This is my module.
"""
def my_test_func(a, b=1):
"""This is my test function"""
return a + b
class MyClass(object):
"""This is my class"""
def __init__(x, y='test'):
"""The init of my class"""
self.x = float(x)
self.y = y
def my_method(self, z):
"""This is my method.
:param z: a number
:type z: float, int
:returns: the sum of self.x and z
:rtype: float
"""
return self.x + z
sphinx-apidoc
将创建
mymodule Module
===============
.. automodule:: mymodule
:members:
:undoc-members:
:show-inheritance:
以下扩展程序(或对conf.py
的补充):
NAMES = []
DIRECTIVES = {}
def get_rst(app, what, name, obj, options, signature,
return_annotation):
doc_indent = ' '
directive_indent = ''
if what in ['method', 'attribute']:
doc_indent += ' '
directive_indent += ' '
directive = '%s.. py:%s:: %s' % (directive_indent, what, name)
if signature: # modules, attributes, ... don't have a signature
directive += signature
NAMES.append(name)
rst = directive + '\n\n' + doc_indent + obj.__doc__ + '\n'
DIRECTIVES[name] = rst
def write_new_docs(app, exception):
txt = ['My module documentation']
txt.append('-----------------------\n')
for name in NAMES:
txt.append(DIRECTIVES[name])
print '\n'.join(txt)
with open('../doc_new/generated.rst', 'w') as outfile:
outfile.write('\n'.join(txt))
def setup(app):
app.connect('autodoc-process-signature', get_rst)
app.connect('build-finished', write_new_docs)
会给你:
My module documentation
-----------------------
.. py:module:: mymodule
This is my module.
.. py:class:: mymodule.MyClass(x, y='test')
This is my class
.. py:method:: mymodule.MyClass.my_method(z)
This is my method.
:param z: a number
:type z: float, int
:returns: the sum of self.x and z
:rtype: float
.. py:function:: mymodule.my_test_func(a, b=1)
This is my test function
然而,由于autodoc
没有发生任何事件,当翻译完成时,因此autodoc进行的进一步处理必须适应此处的文档字符串。