
<p><img src="https://cdn.learnku.com/uploads/images/201804/18/1/P8N4UgjvP3.jpg?imageView2/2/w/1240/h/0" alt="file" /></p>
<p>可读性是 Python 开发人员在项目和代码文档中的主要关注点。遵循一些简单的最佳实践可以为您和其他人节省大量时间。</p>
<h2>项目文档</h2>
<p>在根目录下 <code>README</code> 文件应该对用户和项目维护者提供概述信息。它应该是原始文本或非常容易阅读的标记写成，如 <a href="http://docs.python-guide.org/en/latest/writing/documentation/#restructuredtext-ref">reStructuredText</a> 或 Markdown。 它应该包含几行对项目或库的作用的解释（假设用户不知道项目的任何内容），软件源站点的 URL 和一些基本的信用信息。这个文件应该是代码阅读者的主要入口点。</p>
<p><code>INSTALL</code> 文件对 Python 来说不是必需的。安装指令通常被简化为一个命令，如 <code>pip install module</code> 或 <code>python setup.py install</code> 并且添加到 <code>README</code> 文件中。</p>
<p><code>LICENSE</code> 文件应该 <em>始终</em> 存在并且详细说明软件在什么许可证下对公众可用。</p>
<p><code>TODO</code> 文件或 <code>README</code> 文件中的 <code>TODO</code> 部分应该列出代码的开发计划。</p>
<p><code>CHANGELOG</code> 文件或在 <code>README</code> 对应的部分应该基于最新版本编写一个代码变更概述。</p>
<h2>其他文档</h2>
<p>根据项目的不同，文档中最好能包含下列部分或所有的内容：</p>
<ul><li>一份 <strong>简短介绍</strong> ，应该包含几个简化的用例，简要概述该产品能够用来做什么。</li>
<li>一份 <strong>教程</strong> ，应该展示一些主要的用例以及更多的使用细节。读者能够跟着一步步成功搭建工作原型。</li>
<li>一份 <strong>API 文档</strong>，通常从代码中产生（参见 <a href="http://pythonguidecn.readthedocs.io/zh/latest/writing/documentation.html#docstring-ref">docstrings</a>）。它会列出所有的可供公共访问的接口、参数和返回值。</li>
<li>一份 <strong>贡献文档</strong> 适用于潜在贡献者。这可以包括项目的代码规范和通用设计的策略讲解。</li>
</ul>
<h3>Sphinx</h3>
<p><a href="http://sphinx.pocoo.org/">Sphinx</a> 无疑是最流行的 Python 文档工具。<strong>我们推荐在项目中使用 Sphinx。</strong> 它能把 <a href="http://pythonguidecn.readthedocs.io/zh/latest/writing/documentation.html#restructuredtext-ref">reStructuredText</a> 标记语言转换为流行的输出格式，包括 HTML、LaTeX (可打印 PDF 版本)、手册和纯文本。</p>
<p><a href="http://readthedocs.org/">Read The Docs</a> 是一个 <em>超棒的</em> 并且 <em>免费的</em> 文档托管平台，可以托管您的 <a href="http://sphinx.pocoo.org/">Sphinx</a> 文档。您可以为它配置提交钩子到您的代码库中，这样文档的重新构建即可自动进行。</p>
<p>运行 <a href="http://sphinx.pocoo.org/">Sphinx</a> 时首先导入你的代码，它会使用 Python 的内省功能来提取所有函数，方法和类签名，同时提取附带的文档字符串，并将其全部编译成结构良好且易于阅读的文档。</p>
<blockquote>
<p>Sphinx 因生成  API 文档而著名，但它也适用于普通的文档。本指南（译者注：原始文档）使用 <a href="http://sphinx.pocoo.org/">Sphinx</a> 进行构建， 并托管在 <a href="http://readthedocs.org/">Read The Docs</a> 上。</p>
</blockquote>
<h3>reStructuredText</h3>
<p>大多数 Python 文档是用 <a href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> 编写的。它是一个内建了所有可选扩展的 Markdown 解析器。</p>
<p><a href="http://sphinx.pocoo.org/rest.html">reStructuredText Primer</a> 和 <a href="http://docutils.sourceforge.net/docs/user/rst/quickref.html">reStructuredText Quick Reference</a> 这两个文档应该能帮助你快速熟悉它的语法。</p>
<h2>源码文档建议</h2>
<p>注释能使代码清晰，将其加入到代码中是为了理解代码起来更容易。注释在 Python 中以一个 hash 开始（数字符号）（"#"）。</p>
<p>在 Python 中我们使用 <em>文档字符串（docstrings）</em> 用来描述模块、类和函数：</p>
<pre><code class=" language-php">def square_and_rooter(x):
    """Return the square root of self times self."""
    ...
</code></pre>
<p>一般来说，我们要遵循 <a href="https://www.python.org/dev/peps/pep-0008#comments"><strong>PEP 8#comments</strong></a> （" Python 风格指南"）的注释部分。 更多关于 docstrings 的内容可以在 <a href="https://www.python.org/dev/peps/pep-0257#specification"><strong>PEP 0257#specification</strong></a> （docstrings 约定指南） 上找到。</p>
<h3>注释代码块</h3>
<p><em>请不要使用三引号去注释代码</em>。 这不是好的实践，因为面向行的命令行处理工具， 比如说 <code>grep</code>，将会很难判断注释掉的代码是否是激活的。对每一个注释行，最好使用带有合适缩进的井号。您的编辑器可能很容易做到这一点，并能使用快捷键就切换 注释 / 取消注释。</p>
<h3>Docstrings 的魔法</h3>
<p>一些工具使用 Docstrings 来嵌入不止是文档的行为， 比如说单元测试逻辑等。接下来会给你讲解 Docstrings 的一些奇特的用法，不过话说回来，如果你只是使用 Docstrings 来做函数文档也是完全合理的。</p>
<p>像 <a href="http://sphinx.pocoo.org/">Sphinx</a> 这样的工具会将 Docstrings 解析为 reStructuredText，并以 HTML 格式正确呈现。 这使得将示例代码片段嵌入到项目文档成为可能。</p>
<p>此外， <a href="https://docs.python.org/3/library/doctest.html">Doctest</a> 能够读取所有内嵌的看起来像 Python 命令行输入（以 <code>&gt;&gt;&gt;</code> 为前缀）的 Docstrings  并对其进行运行，以检查命令输出是否匹配其下行内容。这允许开发人员在源码中嵌入真实的示例和函数的用法。 此外，它还能确保代码运行过测试并且正常工作。</p>
<pre><code class=" language-php">def my_function(a, b):
    """
    &gt;&gt;&gt; my_function(2, 3)
    6
    &gt;&gt;&gt; my_function('a', 3)
    'aaa'
    """
    return a * b
</code></pre>
<h3>Docstrings 与块注释的比较</h3>
<p>他们俩是不可互换。对于函数或类，开头的注释区是程序员的注解。而Docstrings 描述了函数或类的 <em>操作性文档</em> ：</p>
<pre><code class=" language-php"># 出于某种原因此函数用来减慢程序执行的
def square_and_rooter(x):
    """返回自己乘以自己的平方根。"""
    ...
</code></pre>
<p>块注释会在脚本执行时被优化掉，与块注释不同，Docstrings 内置于 Python 语言本身。这意味着你可以使用 Python 强大的内省功能以在运行时获得 Docstrings 。对于几乎每个 Python 对象，我们都可以通过其 <em><strong>doc</strong></em> 属性或使用内置的 <code>help()</code> 函数来访问 Docstrings。</p>
<p>块注释通常用于解释一段代码是 <em>做什么</em> ，或是算法的细节。而 Docstrings 更适合于向其他用户（或是写完代码 6 个月以后的你）解释代码中的特定功能是 <em>如何</em> 使用， 或是方法、类和模块的作用。</p>
<h3>编写 Docstrings</h3>
<p>取决于函数、方法或类的复杂度，使用单行的 Docstrings 可能十分合适。 以下通常用于非常明显的情况，例如:</p>
<pre><code class=" language-php">def add(a, b):
    """两个数字相加，并返回结果。"""
    return a + b</code></pre>
<p>Docstrings 应该以易于理解的方式来描述函数。另一方面，对于简单的函数和类， 将函数的签名（即 <code>add(a, b) -&gt; result</code> ）嵌入到  Docstrings 中是没有必要的。这是因为使用 Python 的 "inspect" 模块可以很容易地找到这些信息。 此外，这些信息也可以简单地通过阅读源代码来获得。</p>
<p>在更大或更复杂的项目中，我们建议提供相关函数的更多信息，包括它是做什么的， 所抛的任何异常，返回的内容或参数的相关细节。</p>
<p>对于更详细的代码文档，用于 Numpy 项目上的 Docstrings 风格会更为流行，通常称为 <a href="http://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html">Numpy style</a> Docstrings。因为可以占用更多的行，所以它允许开发人员写入更多的信息。</p>
<pre><code class=" language-php">def random_number_generator(arg1, arg2):
    """
    摘要行。

    扩展功能描述。

    参数
    ----------
    arg1：int
        arg1的描述
    arg2：str
        arg2的描述

    返回
    -------
    int
        返回值说明
    """
    return 42
</code></pre>
<p>Sphinx 下使用 <a href="https://sphinxcontrib-napoleon.readthedocs.io/">sphinx.ext.napoleon</a> 插件即可解析这种风格的 Docstrings， 使您可以轻松地将 NumPy 风格文档植入到你的项目中。</p>
<p>最后，编写 Docstrings 的风格并没那么重要，它们的目的是为任何可能需要阅读或更改代码的人提供文档。 只要它是正确的，可以理解的，切中相关点，那么它就很完美地完成了它的使命。</p>
<p>要进一步阅读 Docstrings，请随时参见 <a href="https://www.python.org/dev/peps/pep-0257"><strong>PEP 257</strong></a></p>
<h2>其他工具</h2>
<p>你可能在其他场景看到过这些，不过没有特殊情况的话，请尽量使用 <a href="http://pythonguidecn.readthedocs.io/zh/latest/writing/documentation.html#sphinx-ref">Sphinx</a>。</p>
<p><a href="https://pycco-docs.github.io/pycco/">Pycco</a></p>
<p>Pycco是一个 "文学编程风格的文档生成器"，它是 node.js <a href="http://jashkenas.github.com/docco">Docco</a> 的移植版本。它将代码生成为一个并排的 HTML 代码区块和对应的文档。</p>
<p><a href="https://github.com/rtomayko/ronn">Ronn</a></p>
<p>Ronn 用来构建 Unix 手册。它将人可读的文本文件转换成用于终端显示的 roff 文件, 以及用于 web 的 HTML 文件。</p>
<p><a href="http://epydoc.sourceforge.net/">Epydoc</a></p>
<p>Epydoc 已经停止维护。请使用 <a href="http://pythonguidecn.readthedocs.io/zh/latest/writing/documentation.html#sphinx-ref">Sphinx</a> 来替代。</p>
<p><a href="http://www.mkdocs.org/">MkDocs</a></p>
<p>MkDocs 是一个快速简单的静态网站生成器，它适合于构建使用 Markdown 编写的项目文档。</p>