最近看了不少代码,也写了不少代码,所以在看和写之间发现了很多的问题,真的是很多,至少从我的认识来看,有几个地方有很大的改进空间,这里不准备把所有的问题都列举出来,所以就先挑选一个比较明显得来和大家聊聊。回顾流行开源项目的成功,除了功能上的刚需之外,文档也是必不可少的一个环节,没有良好文档的开源项目几乎不可能说是流行的,因为很少人会因为你说了一句使用我的项目就可以怎么怎么样就傻不溜秋得用你的。从我以前开源的项目中大家可能会发现一个比较大的问题就是文档工作做得确实不咋地。

项目中的文档我认为可以分为直接文档和间接文档两部分,直接文档就是 README/Read the docs 这类的可以直接阅读的文档,而间接文档就是代码中的注释了。别人在阅读你的项目的时候,首先,直接文档可以让大家对你的项目有一个直观的认识,知道你的项目是干嘛的,大概的实现思路/算法是怎样的;而代码注释就是别人在验证你的项目是否真如你文档所说,实现得是否良好的一种参考,所以两种文档都是很重要的。

在 Python 中,因为 docs comment 的存在,可以让这两种文档归一,其实就是将 comment 抽离出来转化为可以直接阅读的 Document,虽然这有点理想化,但是在一定程度上减少了我们编写文档的难度和复杂度。本文就如何编写这样的 Comment 进行一个简单的总结,同时也是对自己的一个改进。

Google coding-style guide

玩 Python 的同学应该都知道 Python 没有一个业界的代码规范,而 PEP8 这些也不并不能完全对我们的开发起到很好得规范和知道作用。反而,看现在很多人的代码,发现 google coding style 的接受度更高,所以,不妨多参考一些。

模块注释

在 Python 中,每个文件其实都是一个自成模块,所以我就称文件注释为模块注释,模块注释一般就是解释该模块是干嘛用的,以及如何使用该模块等信息,同时,在构建工具之后就变成了文档的主要内容了。不妨我们来看下 requests 的注释:

可以发现其实这份注释还是比较清晰的,可以分为几个部分,分别是:

  1. 功能介绍
  2. 使用 Demo 示例以及参数/返回值等
  3. 版权之类的说明

这算是一份比较标准化的注释了,至于注释的风格,我们可以参照 reStructuredText Primer 这份说明进行练习。

类注释

类的注释的话又稍微复杂一些,除了必要的类说明和使用示例之外,你还需要对类的够赞函数进行参数描述,因为 python 的构造函数是 __init__,而我们通常文档是直接看类的说明,所以这里写在类上很重要!如果你的类存在必要的公共属性,需要对外暴露出来,那么也应该标注出来。我们可以参考一下 Flask 的示例:

前面洋洋洒洒得写了很多说明,然后后面就对构造函数的参数进行了描述。

函数注释

函数的注释应该是最复杂的,因为我们不仅仅最函数的功能进行描述,还要关注函数的参数和返回值,参数又需要描述参数的意义,还要描述参数的类型,返回值也是如此,所以我们也来看看 Celery 的一个示例:

这里只有对函数的解释,注意事项还有返回值,除此之外,我们还经常用的有:

  • Args
  • Returns
  • Raises

从源码构建文档

当我们将我们的源码的注释都注释得七七八八了,觉得是时候编一份文档看看效果如何了,那么你是应该看看下面的介绍啦!

当然,我还是参考一些流行项目的做法,看看人家的文档是怎么做的,说实话,我看过的这么多个项目的文档中,Flask 确实是写得比较好的,当然,Django 的也是不错,不过它的文档过于人工修饰,从源码中还原度没有那么高。所以这里我以 Flask 为例来看看开源项目是如何做注释文档化的。

要想了解自然先尝试一遍,不是太麻烦,将 Flask 的源码 clone 下来之后,只需要简单得使用 make docs,稍等片刻,你就讲得到 docs 的编译版本,默认你会得到 html 版本,位置就在源码目录的 _build/html 目录下。但是,看看 Makefile 再看看 docs 目录你可能又会疑惑,因为 docs 里面已经放置了 rst 文件了,所以这个时候的问题就是如何从 py 文件中抽离 rst 文件!

其实这些问题对于一些工具来说都是很简单的,Flask 用的是 sphinx,这个工具被 Python 世界的大多数开源项目所青睐,所以也成为了一个事实上的文档标准。使用 sphinx 可以让我们轻松得解决两个问题:

  • 抽离 python 注释
  • 将代码文档化

操作过程只是两句命令就可以解决的问题:

  • 将代码中的文档注释抽离出来:sphinx-apidoc -F -o docs flask
  • 将文档转换成 html 形式:sphinx-build -b html . _build/html
    • 或者在第一步的基础上更直接点:make html

这样,你就将你之前的努力都转化成可以被人直观接受的文档了!这里是我转化过的一个示例:

很多时候我们可能对默认转化出来的文档不是很满意,但是,没关系,我们可以在完成第一步之后编辑 rst 文件,然后调整到我们满意之后,再 make html,这样就会好很多!

Reference

  1. Google Python Style Guide
  2. reStructuredText Primer

从开源项目看python代码注释的更多相关文章

  1. 从开源项目看 Python 单元测试

    我觉得以前在我开发程序的时候,除了文档,可能单元测试是另外一个让我希望别人都写,但是自己又一点都不想写的东西.但是,随着开发程序的增多,以及自己对 Bug 的修改的增多,我发现,UT 在很大程度上是对 ...

  2. python代码注释 - python基础入门(4)

    在 python改变世界,从hello world开始 中我们已经完成了第一个python程序,代码是有了,关键是好像好不知道写的啥玩意? 一.什么是代码注释 代码注释就是给一段代码加上说明,表明这段 ...

  3. python开源项目及示例代码

    本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...

  4. python开源项目及示例代码(转)

    本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...

  5. GitHub 上适合新手的开源项目(Python 篇)

    作者:HelloGitHub-卤蛋 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中.为什么这么多人学 Python ?我要喊出那句话了:"人生苦短,我用 Py ...

  6. Sphinx将python代码注释生成文档

    安装 使用pip进行安装: pip install sphinx 初始化 进入你代码所在的目录,输入: sphinx-quickstart 下图:PRD是代码所在目录,生成的文档保存目录设成doc  ...

  7. Python代码 注释

    对某些代码进行标注说明,增加程序的可读性. 一.单行注释 以“#” 开头,#后面的所有东西都不会被运行 print("hello python") # 输出 `hello pyth ...

  8. [C++]项目中的代码注释规范(整理)

    原文:http://blog.csdn.net/pleasecallmewhy/article/details/8658795 1 源文件头部注释 列出:版权.作者.编写日期和描述. 每行不要超过80 ...

  9. vs2008 多人同时开发项目时的代码注释规范格式 分类: C#小技巧 2014-04-23 14:12 297人阅读 评论(0) 收藏

    多人同时开发一个项目,区分项目的那个窗体是谁开发的,例:下面的格式 /************************************************       模块:服务器设置   ...

随机推荐

  1. 刚从it培训班出来的学生如何走向工作岗位

    大家好,这是我本人在博客园的第一篇博文. 相信很多人都是从 it 培训班学习然后加入到程序员这个大家族,或多或少,有些人会和博主有一样的感受,所以此篇博文我们不讨论技术,博主也是刚从培训班坑里跳出来正 ...

  2. Qt快速上手(学习笔记四)

    拖了大半年,今天终于有更新了...我自己都不好意思,最近太忙了! 今天讲一下:QML语法 一 概述 QML是一种专门用于构建用户界面的编程语言,它允许用户构建高性能,具有流畅特效的可视化应用程序,QM ...

  3. sphinx+reStructuredText制作文档

    1 spinx简介 Sphinx 是一种文档工具,它可以令人轻松的撰写出清晰且优美的文档, 由 Georg Brandl 在BSD 许可证下开发. 新版的Python文档 就是由Sphinx生成的,并 ...

  4. hihoCoder_二分·归并排序之逆序对

    一.题目 题目1 : 二分·归并排序之逆序对 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 在上一回.上上回以及上上上回里我们知道Nettle在玩<艦これ&g ...

  5. 黑马day16 jquery&amp;内容过滤选择器&amp;可见度选择器

    内容过滤选择器的过滤规则主要体如今它所包括的子元素和文本内容上 .:contains(text) 使用方法: $("div:contains('John')")    返回值  集 ...

  6. Windows 下Oracle database 9i 64bit 仅仅有 Windows Itanium 64bit

    Windows 下Oracle database 9i 64bit 仅仅有 Windows Itanium 64bit,没有Windows x86-64bit的 详细请见例如以下的certificat ...

  7. 漂亮CSS样式用户留言表单

    基本样式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  8. 【ASP.NET MVC】MVC概述

    描述 本篇文章主要概述ASP.NET MVC,具体包括如下内容: 1.MVC模式概述 2.WebForm概述 3.WebForm与MVC区别 4.ASP.NET MVC发展历程 5.运用程序结构 6. ...

  9. 创业公司快速搭建立体化监控之路(WOT2016)

    本文内容:创业型公司如何快速搭建可扩展,可落地的立体化监控平台 一.需求缘起 创业型公司有系统监控么?来看两个case: case 1:CXO大群内贴了一张"用户微信投诉"的截图 ...

  10. Asp.Net Web API(三)

    Routing Tables路由表 在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public方法就被叫做action方法或简单的Action.当Web API接 ...