
注:本专栏文章未经允许请勿转载。
知乎上有不少人问和关注阅读开源项目代码这个问题,比如「 初学 python,有哪些 Pythonic 的源码推荐阅读? 」、「 github中适合新人阅读的Python项目有哪些? 」、「 如何去阅读并学习一些优秀的开源框架的源码?」等。本文将从推荐可阅读的Python项目和如何阅读者2个方面聊聊这个话题。
阅读Python开源项目代码主要有如下三个原因:
1. 在工作过程中遇到一些问题,Google和StackOverFlow等网站找不到解决办法,只能去翻源码。
2. 对某些项目或者方向非常感兴趣,希望深入。
3. 学习遇到瓶颈需要汲取开源项目的经验和用法来做提高。
没有目的的阅读开源项目就是耍流氓。 浪费了时间,但是能学到的东西也很少。怎么样根据自身情况去阅读呢?
1. 和兴趣以及工作契合。举个例子,工作中没有机会用到Celery又不是想自己造个轮子,读它的源码做什么?所以要从平时能接触到的那些项目中选取。比如我,我肯定不去看Django的代码,因为日常工作基本遇不到,遇到了现翻就好了。
2. 一个方向只看一两个典型的就可以了。比如Web框架,我只看过Bottle和Flask的源码(其实之前也看过Django的,只是浅尝辄止),而且看Bottle已经是好几年前的事情了。并不是堆的多了更好,有时候反而选择太多会懵。
3. 不同技术阶段的选择代码量、复杂度不一样的项目,下面会具体推荐。
4. 清楚自己看代码的目的。就是你看代码是想了解人家怎么设计、调试BUG、还是只是想学习正确的编程用法呢?其实没有必要细抠每个代码细节,有时候当黑盒看,知道输入输出就可以了。
我个人的喜好和工作中看别人代码差不多,基本每个人、每个项目、每个团队都有自己写代码的风格,比如变量命名风格、某些语言特性使用方式、代码规范要求、目录风格等,其实开源项目的作者也是一样。看代码,如看人(团队)。 首先介绍下我的喜好(排名分先后):
1. kennethreitz 。requests和python-guide作者。他还有一个非常励志的故事,有兴趣的可以看 谁说程序员不是潜力股?
2. mitsuhiko 。flask、Jinja2、werkzeug和flask-sqlalchemy作者。
3. sigmavirus24 。flake8、pycodestyle(原pep8)、requests、urllib3等项目的主要贡献者和维护者。
4. ask 。Celery及相关依赖的作者。
5. ajdavis 。mongo-python-driver(pymongo)、tornado等项目的主要贡献者。
6. bitprophet 。fabric、paramiko(Python的ssh库)作者。
前2个是公认的Python领域代码写的最好的、最有创意的工程师。
初学者推荐阅读项目初学者可以先阅读一些代码量比较少的,最好是单文件的项目:
1. GitHub - kennethreitz/pip-pop: Tools for managing requirements files.
2. GitHub - kennethreitz/envoy: Python Subprocesses for Humans.
3. GitHub - kennethreitz/records: SQL for Humans
4. GitHub - mitsuhiko/pluginbase: A simple but flexible plugin system for Python.
5. GitHub - mitsuhiko/pipsi: pip script installer
6. GitHub - mitsuhiko/unp: Unpacks things.
7. GitHub - chrisallenlane/cheat
8. GitHub - jek/blinker: A fast Python in-process signal/event dispatching system.
9. GitHub - mitsuhiko/platter: A useful helper for wheel deployments.
10. GitHub - kennethreitz/tablib: Python Module for Tabular Datasets in XLS, CSV, JSON, YAML, &c.
看代码主要是了解别人写代码的方式,语法实践这些内容。看完之后,你可以针对这些项目能解决的问题自己写个项目,写完之后和上述项目去对比一下,看看哪些方面做的不好。
进阶阅读项目进阶的时候就要阅读一些相对复杂的项目,它们能帮助你提升Python编程技巧:
1. faif/python-patterns 。使用Python实现一些设计模式的例子。
2. pallets/werkzeug 。flask的WSGI工具集。其中包含了实现非常好的LocalProxy、cached_property、import_string、find_modules、TypeConversionDict等。
3. bottlepy/bottle 。阅读一个Web框架对Web开发就会有更深刻的理解,flask太大,bottle就4k多行,当然如果你有毅力和兴趣直接看flask是最好了的。
4. msiemens/tinydb 。了解用Python实现数据库。
5. coleifer/peewee 。了解ORM的实现。
6. pallets/click 。click已经内置于在flask 0.11里,提供命令行功能,值得阅读。
7. mitsuhiko/flask-sqlalchemy 。了解一个flask插件是怎么实现的。
除此之外Web开发者可以阅读一些相关的项目:
1. runscope/httpbin 。使用flask,网站是 httpbin(1): HTTP Client Testing Service 。
2. jahaja/psdash 。使用flask和psutils的获取linux系统信息的面板应用。
3. pallets/flask-website 。 flask官方网站应用。
4. pypa/warehouse 。如果你使用pyramid,这个 新版的PYPI网站 ,可以帮助你理解很多。
当然,2个学习flask重要的资源必须爆一爆:
1. GitHub - realpython/discover-flask: Full Stack Web Development with Flask 。
2. The Flask Mega-Tutorial 。 这个就是《Flask Web开发:基于Python的Web应用开发实战》的原始博客。
500lines 推荐一个非常厉害的项目