我一直认为读源码是一种比较“低效”的学习方法。我用 yolk -al 看了一下安装的模块,发现居然也没有几个算是“读过”的。web.py 的读过一点,它的接口很 pythonic,但这货的实现应该算不上是非常 pythonic 的代码。
如果一定要推荐一些 python 的源码去读,我的建议是标准库里关于网络的代码。从 SocketServer 开始,补上 socket 模块的知识,熟悉 TCP/UDP 编程,然后了解 Mixin 机制的最佳示例 SocketServer.{ForkingMixIn|ThreadingMixIn},借这个机会了解 thread/threading 模块,这时会对并发量提出新的要求,就可以读 select 模块,开始对 select/{epoll|kqueue} 有深刻理解,搞懂以后就可以接触一下异步框架 asyncore 和 asynchat。这时开始出现分岔。如果是做 game 等以 TCP/UDP 协议为基础的应用,可以去读 greenlet 和 gevent,如果是做 web,则走下一条路。
做 web,读 BaseHTTPServer、SimpleHTTPServer 和 CGIHTTPServer,读 cgi/cgitb,自己随意写框架,读cookielib,读 wsgiref,这时候自己写一个简便的 web framework 就 so easy 了,老板再也不担心你写 web 了,选择 flask/web.py/django/pyramid 都心中有数了。因为走的是 web 的路,所以难免要调用一下别人的 api,搞懂一下 httplib/urllib/urllib/urlparse。
这个题目本身就有点困难. 因为好的源码都带有对python更深入的理解,熟悉各种python标准库模块使用和以及各种trick,岂是初学者那么好懂的?直接标准库模块的就算了吧....
我觉得好的代码要有:
1. pythonic的用法
2. 大量的注释(甚至注释远多于代码)
3. 不要那么复杂的逻辑