gpt4 book ai didi

python - 我如何从 boost::python 文档字符串创建 doxygen 文档?

转载 作者:行者123 更新时间:2023-11-28 17:32:40 30 4
gpt4 key购买 nike

我已经使用 boost::python 为大量 C++ 代码创建了 python 绑定(bind)。 python 绑定(bind)有这样的文档:

BOOST_PYTHON_MODULE(mymodule)
{
using namespace boost::python;
def("foo1", foo1, arg("i"), "foo1 doc");
}

项目的其余部分用 doxygen 记录。我想知道是否有办法从 python 绑定(bind)的文档字符串生成 doxygen 文档。

对我来说,我似乎有两个选择:

  • 使用魔术工具导入python文件并输出文档。 Sphinx 在一定程度上起作用,因为它的 autodoc 工具实际上加载 python 模块并扫描文档字符串。但是,它没有生成 doxygen 可以使用的输出格式(我想?)。
  • 编写一个转换过程以导入 BOOST_PYTHON_MODULE。调用帮助(我的模块)。解析输出以生成骨架 python 文件。像往常一样将它们喂入 doxygen。

有没有更好的办法?

最佳答案

来自 this topic ,您可以执行以下操作:

1 - 编写 doxygen 文档:

// DocString: foo
/**
* @brief Foo doc
* @param i an integer
* @return something
*
*/
int foo(int i);

2 - 更新您的绑定(bind)文档:

BOOST_PYTHON_MODULE(mymodule)
{
using namespace boost::python;
def("foo1", foo1, arg("i"), "@DocString(foo)");
}

3 - 使用如下脚本配置您的文件(在构建链中):

import re
import sys

def parse_doc_string(istr):
pattern = re.compile(r'@(\w+)\s+(.*)')
docstring = list()
for line in map(lambda s : s.strip(), istr):
if line == '/**':
continue
if line == '*/':
return docstring
line = line.lstrip('* ')
match = pattern.match(line)
if match:
docstring.append((match.group(1), match.group(2)))

def extract(istr, docstrings):
pattern = re.compile(r'^//\s*DocString:\s*(\w+)$')
for line in map(lambda s : s.strip(), istr):
match = pattern.match(line)
if match:
token = match.group(1)
docstrings[token] = parse_doc_string(istr)

def format_doc_string(docstring):
return '\n'.join('{}: {}'.format(k, v) for (k, v) in docstring)

def escape(string):
return string.replace('\n', r'\n')

def substitute(istr, ostr, docstrings):
pattern = re.compile(r'@DocString\((\w+)\)')
for line in map(lambda s : s.rstrip(), istr):
for match in pattern.finditer(line):
token = match.group(1)
docstring = format_doc_string(docstrings[token])
line = line.replace(match.group(0), escape(docstring))
print(line, file=ostr)

if __name__ == '__main__':
sourcefile = sys.argv[1]
docstrings = dict()
with open(sourcefile) as istr:
extract(istr, docstrings)
with open(sourcefile) as istr:
with sys.stdout as ostr:
substitute(istr, ostr, docstrings)

它将通过以下方式替换您的绑定(bind):

def("foo1", foo1, arg("i"), "brief: Foo doc\nparam: i an integer\nreturn: something");

关于python - 我如何从 boost::python 文档字符串创建 doxygen 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33268337/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com