从开源项目看python代码注释
最近看了不少代码,也写了不少代码,所以在看和写之间发现了很多的问题,真的是很多,至少从我的认识来看,有几个地方有很大的改进空间,这里不准备把所有的问题都列举出来,所以就先挑选一个比较明显得来和大家聊聊。回顾流行开源项目的成功,除了功能上的刚需之外,文档也是必不可少的一个环节,没有良好文档的开源项目几乎不可能说是流行的,因为很少人会因为你说了一句使用我的项目就可以怎么怎么样就傻不溜秋得用你的。从我以前开源的项目中大家可能会发现一个比较大的问题就是文档工作做得确实不咋地。
项目中的文档我认为可以分为直接文档和间接文档两部分,直接文档就是 README/Read the docs 这类的可以直接阅读的文档,而间接文档就是代码中的注释了。别人在阅读你的项目的时候,首先,直接文档可以让大家对你的项目有一个直观的认识,知道你的项目是干嘛的,大概的实现思路/算法是怎样的;而代码注释就是别人在验证你的项目是否真如你文档所说,实现得是否良好的一种参考,所以两种文档都是很重要的。
在 Python 中,因为 docs comment 的存在,可以让这两种文档归一,其实就是将 comment 抽离出来转化为可以直接阅读的 Document,虽然这有点理想化,但是在一定程度上减少了我们编写文档的难度和复杂度。本文就如何编写这样的 Comment 进行一个简单的总结,同时也是对自己的一个改进。
Google coding-style guide
玩 Python 的同学应该都知道 Python 没有一个业界的代码规范,而 PEP8 这些也不并不能完全对我们的开发起到很好得规范和知道作用。反而,看现在很多人的代码,发现 google coding style 的接受度更高,所以,不妨多参考一些。
模块注释
在 Python 中,每个文件其实都是一个自成模块,所以我就称文件注释为模块注释,模块注释一般就是解释该模块是干嘛用的,以及如何使用该模块等信息,同时,在构建工具之后就变成了文档的主要内容了。不妨我们来看下 requests 的注释:

可以发现其实这份注释还是比较清晰的,可以分为几个部分,分别是:
- 功能介绍
- 使用 Demo 示例以及参数/返回值等
- 版权之类的说明
这算是一份比较标准化的注释了,至于注释的风格,我们可以参照 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
从开源项目看python代码注释的更多相关文章
- 从开源项目看 Python 单元测试
我觉得以前在我开发程序的时候,除了文档,可能单元测试是另外一个让我希望别人都写,但是自己又一点都不想写的东西.但是,随着开发程序的增多,以及自己对 Bug 的修改的增多,我发现,UT 在很大程度上是对 ...
- python代码注释 - python基础入门(4)
在 python改变世界,从hello world开始 中我们已经完成了第一个python程序,代码是有了,关键是好像好不知道写的啥玩意? 一.什么是代码注释 代码注释就是给一段代码加上说明,表明这段 ...
- python开源项目及示例代码
本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...
- python开源项目及示例代码(转)
本页面是俺收集的各种 Python 资源,不定期更新. 下面列出的各种 Python 库/模块/工具,如果名称带超链接,说明是第三方的:否则是 Python 语言内置的. 1 算法 1.1 字符串处理 ...
- GitHub 上适合新手的开源项目(Python 篇)
作者:HelloGitHub-卤蛋 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中.为什么这么多人学 Python ?我要喊出那句话了:"人生苦短,我用 Py ...
- Sphinx将python代码注释生成文档
安装 使用pip进行安装: pip install sphinx 初始化 进入你代码所在的目录,输入: sphinx-quickstart 下图:PRD是代码所在目录,生成的文档保存目录设成doc ...
- Python代码 注释
对某些代码进行标注说明,增加程序的可读性. 一.单行注释 以“#” 开头,#后面的所有东西都不会被运行 print("hello python") # 输出 `hello pyth ...
- [C++]项目中的代码注释规范(整理)
原文:http://blog.csdn.net/pleasecallmewhy/article/details/8658795 1 源文件头部注释 列出:版权.作者.编写日期和描述. 每行不要超过80 ...
- vs2008 多人同时开发项目时的代码注释规范格式 分类: C#小技巧 2014-04-23 14:12 297人阅读 评论(0) 收藏
多人同时开发一个项目,区分项目的那个窗体是谁开发的,例:下面的格式 /************************************************ 模块:服务器设置 ...
随机推荐
- SQL Server学习之路(七):Python3操作SQL Server数据库
0.目录 1.前言 2.准备工作 3.简单测试语句 4.提交与回滚 5.封装成类的写法 1.前言 前面学完了SQL Server的基本语法,接下来学习如何在程序中使用sql,毕竟不能在程序中使用的话, ...
- S2b只适合于电商吗?
万物互联时代,任何产业蓬勃发展都离不开互联网,从B2M.B2B.B2C.C2C.M2M,层出不穷的商业模式都让人眼花缭乱,最近还推出了s2b这个全新的模式. S代表着大的供应平台,它将更好地赋能给更多 ...
- oracle概念
.DDL 数据定义语言 create alter drop truncate .DML 数据操作语言 insert delete update select .TCL 事务控制语言 commit ro ...
- Python爬虫(十)_正则表达式
本篇将介绍python正则表达式,更多内容请参考:[python正则表达式] 什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操 ...
- poj 2570 Fiber Network(floyd)
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...
- TextMesh Pro 超链接解析失败
前言 软件环境 Unity3D 5.3.7p4 TextMesh Pro 1.0.555.0b11(Jul 06.2017) UGUI做为UI解决方案 文档资料 TextMesh Pro的资料,可以参 ...
- 【转载】Java 类加载与初始化
原文地址:http://www.cnblogs.com/zhguang/p/3154584.html 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在J ...
- 自学Zabbix1.3-zabbix进程
默认情况下zabbix包含5个程序:zabbix_agentd.zabbix_get.zabbix_proxy.zabbix_sender.zabbix_server,另外一个zabbix_java_ ...
- urllib2的基本使用
urlopen 1 import urllib2 2 3 # 向指定的url发送请求,并返回服务器响应的类文件对象 4 response = urllib2.urlopen("http:// ...
- NodeJs学习笔记(四)---单元测试
sailsjs框架用了一段时间了,感觉如果功能复杂了,非常难以处理,想用一下单元测试,看是否能解决问题. sailsjs的官方文档使用的是mocha,我搜索了一些资料,主要参考了朴灵 ...