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

项目中的文档我认为可以分为直接文档和间接文档两部分,直接文档就是 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. 小白的Python之路 day1 变量

    Python之路,Day1 - Python基础1 变量 变量用于存储在计算机程序中引用和操作的信息.它们还提供了一种用描述性名称标记数据的方法,这样我们的程序就能更清晰地被读者和我们自己理解.将变量 ...

  2. Sagit.Framework For IOS 开发框架入门教程3:Start引导页及框架布局和隐藏事件的内幕

    前言: 框架依旧在快速更新着:在重构.简化代码,统一标准的过程中. 中间也遇到各种坑,不过好在一步一脚印的解决了. 虽然还有些功能还在思考,不过教程,还是得补上: 上篇文章:Sagit.Framewo ...

  3. Python爬虫(八)_Requests的使用

    Requests:让HTTP服务人类 虽然Python的标准库中urllib2模块中已经包含了平常我们使用的大多数功能,但是它的API使用起来让人感觉不太好,而Requests自称"HTTP ...

  4. HDU 1013.Digital Roots【模拟或数论】【8月16】

    Digital Roots Problem Description The digital root of a positive integer is found by summing the dig ...

  5. 利用java mail发送邮件(转)

    JavaMail是SUN提供给开发者在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持经常使用的邮件协议,如SMTP.POP3.IMAP.开发者使用JavaMail编写邮件程序时,无需考 ...

  6. url特殊字符转义及解决方法

    URL特殊字符需转义 1.空格换成加号(+) 2.正斜杠(/)分隔目录和子目录 3.问号(?)分隔URL和查询 4.百分号(%)制定特殊字符 5.#号指定书签 6.&号分隔参数 转义字符的原因 ...

  7. linux 磁盘管理三部曲——(3)mount挂载,/etc/fstab配置文件

    当我们分完区,并做好文件系统格式化,就到了最后的挂载mount了,挂载完毕就可以使用磁盘设备了. 一.什么是挂载,卸载 任何块设备都不能直接访问,需挂载在目录上访问 挂载: 将额外文件系统与根文件系统 ...

  8. dedecms在php7下的使用方法,织梦dedecsm后台一片空白的解决方法

    前几天,一个老客户,最近升级了服务器,php到php7,把织梦dedecms转移到新服务器后,不能登录后台,让帮忙看一下. 我看了下他们的网站,使用的是织梦V57_UTF8_SP1前台页面是可以访问的 ...

  9. 《软件开发者路线图:从学徒到高手》【PDF】下载

    <软件开发者路线图:从学徒到高手>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196346 图书简介 作为一名软件开发者,你在奋力 ...

  10. 微信小程序使用场景延伸:扫码登录、扫码支付

    微信小程序使用场景延伸:扫码登录.扫码支付 小程序最适合的使用场景有哪些?相比大家能列举出来很多,但这个场景,大家可能多数没想到_^ 笔者团队近期接到了一个PC项目:转转游戏租号PC官网,该项目要求在 ...