根据里面的注释记录和详细描述单个脚本

Mat*_*ieu 6 python documentation

我将编写一组脚本,每个脚本独立于其他脚本,但有一些相似之处。所有脚本的结构很可能都相同,可能看起来像:

# -*- coding: utf-8 -*-
"""
Small description and information
@author: Author
"""

# Imports
import numpy as np
import math
from scipy import signal
...

# Constant definition (always with variable in capital letters)
CONSTANT_1 = 5
CONSTANT_2 = 10

# Main class
class Test():
    def __init__(self, run_id, parameters):
        # Some stuff not too important
        
    def _run(self, parameters):
        # Main program returning a result object. 
Run Code Online (Sandbox Code Playgroud)

对于每个脚本,我想编写文档并将其导出为 PDF。我需要一个库/模块/解析器来读取脚本、提取注释、代码并将其重新组合成所需的输出格式。

例如,在_run()方法中,注释中可能有几个详细的步骤:

def _run(self, parameters):
        # Step 1: we start by doing this
        code to do it
            
        # Step 2: then we do this
        code to do it
        code 
        code # this code does that
Run Code Online (Sandbox Code Playgroud)

我可以使用哪个库/解析器来分析 python 脚本并输出 PDF? 起初,我在考虑sphinx,但它不适合我的需要,因为我必须设计一个自定义扩展。此外,sphinx 的优势在于相同或不同模块的多个脚本之间的链接和层次结构。就我而言,我一次只会记录一个脚本,一个文件。

然后,我的第二个想法是使用RST格式和RST2PDF来创建 PDF。对于解析器,我可以设计一个解析器,它读取.py文件并提取下面建议的注释/装饰行或行集,然后编写RST文件。

#-description
## Title of something
# doing this here
#-

#-code
some code to extract and put in the doc
some more code
#-
Run Code Online (Sandbox Code Playgroud)

最后,我还希望能够执行一些代码并捕获结果,以便将其放入输出 PDF 文件中。例如,我可以运行 python 代码来计算.py文件内容的 SHA1 哈希值,并将其作为参考包含在 PDF 文档中。

Hen*_*rik 3

文档字符串代替注释

\n

为了让事情变得更容易,您可能想使用文档字符串而不是注释:

\n
\n

文档字符串是一个字符串文字,作为模块、函数、类或方法定义中的第一个语句出现。这样的文档字符串成为__doc__该对象的特殊属性。

\n
\n

__doc__这样,您可以在生成文档时解析脚本时使用该属性。

\n

紧接在成为文档字符串的函数/模块定义之后放置的三个双引号字符串只是语法糖。您可以__doc__根据需要以编程方式编辑属性。

\n

例如,您可以使用装饰器来使文档字符串的创建在您的特定情况下更好。例如,让您内联注释步骤,但仍将注释添加到文档字符串中(在浏览器中编程,可能有错误):

\n
def with_steps(func):\n  def add_step(n, doc):\n    func.__doc__ = func.__doc__ + "\\nStep %d: %s" % (n, doc)\n  func.add_step = add_step\n\n@with_steps\ndef _run(self, parameters):\n  """Initial description that is turned into the initial docstring"""\n  _run.add_step(1, "we start by doing this")\n  code to do it\n        \n  _run.add_step(2, "then we do this")\n  code to do it\n  code \n
Run Code Online (Sandbox Code Playgroud)\n

这将创建一个像这样的文档字符串:

\n
\n

转换为初始文档字符串的初始描述
\n第 1 步:我们首先执行此操作
\n第 2 步:然后我们执行此操作

\n
\n

你明白了。

\n

从记录的脚本生成 PDF

\n狮身人面像\n

就我个人而言,我只是尝试使用 Sphinx 可用的 PDF 构建器,通过捆绑的LaTeXBuilder或使用rinoh(如果您不想依赖 LaTeX)。

\n

但是,您必须使用 Sphinx 理解的文档字符串格式,例如 reStructuredText 或 Google Style Docstrings。

\n AST \n

另一种方法是使用ast来提取文档字符串。这可能是 Sphinx autodoc 扩展在内部使用的从源文件中提取文档的方法。有一些关于如何执行此操作的示例,例如此要点此博客文章

\n

这样您就可以编写一个脚本来解析并输出您想要的任何格式。例如,您可以输出 Markdown 或 reST 并使用pandoc将其转换为 PDF 。

\n

您可以直接在文档字符串中编写标记文本,这将为您提供很大的灵活性。假设您想使用 markdown \xe2\x80\x93 编写文档,只需直接在文档字符串中编写 markdown 即可。

\n
def _run(self, parameters):\n  """Example script\n  ================\n\n  This script does a, b, c\n\n  1. Does something first\n  2. Does something else next\n  3. Returns something else\n\n  Usage example:\n  \n      result = script(parameters)\n      foo = [r.foo for r in results]\n  """\n
Run Code Online (Sandbox Code Playgroud)\n

可以使用 ast 提取该字符串,并使用您认为合适的任何库进行解析/处理。

\n