作者:

Destiny

来源:https://learnku.com/articles/23010/teach-you-to-read-the-python-open-source-project-code

为什么要阅读开源代码

阅读 Python 开源项目代码主要有如下三个原因:

在工作过程中遇到一些问题 Google 和 StackOverFlow 等网站找不到解决办法,只能去翻源码。

对某些项目或者方向非常感兴趣,希望深入。

学习遇到瓶颈需要汲取开源项目的经验和用法来做提高。

要有目的的阅读开源项目

没有目的的阅读开源项目就是耍流氓,浪费了时间,但是能学到的东西也很少。怎么样根据自身情况去阅读呢?

和兴趣以及工作契合。举个例子,工作中没有机会用到 Celery 又不是想自己造个轮子,读它的源码做什么?所以要从平时能接触到的那些项目中选取。有时候不去看 Django 的代码,因为日常工作基本遇不到,遇到了现翻就好了。

一个方向只看一两个典型的就可以了。比如 Web 框架只看过 Bottle 和 Flask 的源码。

清楚自己看代码的目的。就是你看代码是想了解人家怎么设计、调试 BUG、还是只是想学习正确的编程用法呢?其实没有必要细抠每个代码细节,有时候当黑盒看,知道输入输出就可以了。

优秀的开源作者

和工作中看别人代码差不多,基本每个人、每个项目、每个团队都有自己写代码的风格,比如变量命名风格、某些语言特性使用方式、代码规范要求、目录风格等,其实开源项目的作者也是一样。看代码,如看人「团队」

kennethreitzRequests 和 Python-guide 作者。他还有一个非常励志的故事,有兴趣的可以看 谁说程序员不是潜力股?

mitsuhikoflask、Jinja2、werkzeug 和 flask-sqlalchemy 作者。

sigmavirus24flake8、pycodestyle「原 pep 8」、requests、urllib3 等项目的主要贡献者和维护者。

askCelery 及相关依赖的作者。

ajdavismongo-python-driver「pymongo」、tornado 等项目的主要贡献者。

bitprophetfabric、paramiko「Python 的 ssh 库」作者。

前 2 个是公认的 Python 领域代码写的最好的、最有创意的工程师。

初学者推荐阅读项目

初学者可以先阅读一些代码量比较少的,最好是单文件的项目:

GitHub - kennethreitz/pip-pop: Tools for managing requirements files

(https://github.com/heroku-python/pip-pop)

GitHub - kennethreitz/envoy: Python Subprocesses for Humans™.

(https://github.com/not-kennethreitz/envoy)

GitHub - kennethreitz/records: SQL for Humans™

(https://github.com/kennethreitz/records)

GitHub - mitsuhiko/pluginbase: A simple but flexible plugin system for Python.

(https://github.com/mitsuhiko/pluginbase)

GitHub - mitsuhiko/pipsi: pip script installer

(https://github.com/mitsuhiko/pipsi/)

GitHub - mitsuhiko/unp: Unpacks things.

(https://github.com/mitsuhiko/unp)

GitHub - chrisallenlane/cheat

(https://github.com/chrisallenlane/cheat/)

GitHub - jek/blinker: A fast Python in-process signal/event dispatching system.

(https://github.com/jek/blinker)

看代码主要是了解别人写代码的方式,语法实践这些内容。看完之后,你可以针对这些项目能解决的问题自己写个项目,写完之后和上述项目去对比一下,看看哪些方面做的不好。

进阶阅读项目

进阶的时候就要阅读一些相对复杂的项目,它们能帮助你提升 Python 编程技巧:

faif/python-patterns(https://github.com/faif/python-patterns)  使用 Python 实现一些设计模式的例子。

pallets/werkzeug(https://github.com/pallets/werkzeug) flask 的 WSGI 工具集。其中包含了实现非常好的 LocalProxy、cached_property、import_string、find_modules、TypeConversionDict 等。

bottlepy/bottle(https://github.com/bottlepy/bottle)  阅读一个 Web 框架对 Web 开发就会有更深刻的理解,flask 太大,bottle 就 4k 多行,当然如果你有毅力和兴趣直接看 flask 是最好了的。

msiemens/tinydb(https://github.com/msiemens/tinydb) 了解用 Python 实现数据库。

coleifer/peewee(https://github.com/coleifer/peewee) 了解 ORM 的实现。

pallets/click(https://github.com/pallets/click) click 已经内置于在 flask 0.11 里,提供命令行功能,值得阅读。

mitsuhiko/flask-sqlalchemy(https://github.com/pallets/flask-sqlalchemy) 了解一个 flask 插件是怎么实现的。

除此之外 Web 开发者可以阅读一些相关的项目:

runscope/httpbin(https://github.com/kennethreitz/httpbin) 使用 flask

jahaja/psdash(https://github.com/Jahaja/psdash) 使用 flask 和 psutils 的获取 Linux 系统信息的面板应用。

pallets/flask-website(https://github.com/pallets/flask-website) flask 官方网站应用。

pypa/warehouse(https://github.com/pypa/warehouse) 如果你使用 pyramid,这个 新版的 PYPI 网站 可以帮助你理解很多。

500 Lines

推荐一个非常厉害的项目 GitHub - aosabook/500lines(https://github.com/aosabook/500lines): 500 Lines or Less, 它里面包含了 22 个由该领域的专家完成,用不到 500 行的代码实现一个特定功能的子项目。连 Guido van Rossum 都亲自来写基于 asyncio 爬虫了,Nick Coghlan、ajdavis 也出场了。

不要畏惧

大家都经常会感叹 XXX 强大,YYY 流行,无形中你会把它放在一个不可触及到的地位,感觉它很难,而令自己不敢去挑战它。其实是人就会产出 bug,假如你发现它有问题,就应该抓住机会去验证它。这个过程中,它的神秘感也就消失了,有过这么几次经验你就有信心了。其次是不要怕你提交的 PR 被拒绝。这是非常正常的,我有很多 PR 是被拒绝的,尤其是给标准库提交的 Patch,绝大多数都被拒绝了。

带着问题去阅读代码

这也是我认为最有效的方式。这会让你在阅读时候有个主线,比较有针对性。

断点调试

在 Python 代码中使用 pdb 一般不太好使,因为代码复杂的话,这种断点需要你使用多个 N 跳到对应的位置,我一般都是先抛出异常,然后使用 pdb 的 up、down、n 等命令调试。当然在目标位置添加一些 print 日志或注释部分代码然后直接使用 exit() 退出也是可以的。

善用文档

阅读一个项目一开始会有点无从下手,那么就先好好这些内容,它们一般都是作者表达这个项目的第一个入口。quickstart、tutorial 等内容中的最小化的例子其实就是最好的阅读入口,先去看这些引用的模块和调用的对应方法或者函数的对应实现,从下至上去阅读。

理解作者的思考方式

不同的项目要有不同的思考方式来阅读,不要拧着自己的习惯去阅读,这样会很累,得尝试接受别人的观点,甚至于改变自己。

阅读项目的早期版本

一些项目随着时间演进已经非常复杂了,读起来有难度,那么你可以回到项目的早期版本上,先去看相对简单地版本,然后设置几个时间点或者版本节点,渐进的来阅读。

记忆并绘制项目架构

项目就是一堆代码的组合,除了学习编程技巧,还要了解项目的架构决策,这对于未来自己写大型项目非常用用。这种理解越补充,你会对它就越来越清晰。

—— 推 荐 阅 读 ——

如何读懂python代码_教你如何阅读 Python 开源项目代码相关推荐

  1. 怎么查看自己安装的python版本_教你如何检查 Python 版本

    本教程介绍如何使用 命令行检查操作系统上安装的 Python 版本.这在安装用 Python 编写的需要特定版本 Python 的应用程序时非常有用. Python 是世界上最流行的编程语言之一.它用 ...

  2. axure转化成代码_​教大家如何查看Axure页面的代码

    近日有关于如何查看Axure页面的代码的问题受到了很多网友们的关注,大多数网友都想要知道如何查看Axure页面的代码的具体情况,那么关于到如何查看Axure页面的代码的相关信息,小编也是在网上进行了一 ...

  3. 教孩子学编程python豆瓣_教孩子学编程 Python

    教孩子学习Python目录第1章Python编程基础知识:了解环境111知道Python 312编写的Python程序513运行Python程序514章总结615编程挑战7章2只乌龟图:图纸与Pyth ...

  4. python字符串_教你快速了解 Python 字符串

    我们知道字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' ...

  5. 孩子学python教程_教孩子学编程 PYTHON语言版 PDF_IT教程网

    资源名称:教导孩子们如何学习PYTHON编程语言版本PDF资源目录:第1章PYTHON Basics-Understanding环境1了解PYTHON 3编写程序在PYTHON中运行PYTHON程序5 ...

  6. python 手机_教你如何用Python向手机发送通知

    ------------恢复内容开始------------ 你曾想尝试在服务器端或电脑上向手机发送通知吗? 你曾烦恼过企业邮箱的防骚扰机制吗? 现在,我们可以用一种简单轻松的方法来代替企业邮箱了! ...

  7. python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析

    Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...

  8. 外星人颜色python练习_在知乎上学Python爬虫

    有很多人正在入门Python爬虫,学习Python爬虫.在这个过程中,会遇到很多难题,许多小伙伴都会去寻找答案,但是因为答案的纷繁复杂和种类多样,往往要花上好些时间. 而码不理经常会在知乎上寻找学习问 ...

  9. 如何学习Python开源项目代码

    2019独角兽企业重金招聘Python工程师标准>>> 阅读Python开源项目代码主要有如下三个原因: 1. 在工作过程中遇到一些问题,Google和StackOverFlow等网 ...

最新文章

  1. redis的spring的xml配置
  2. 小块头大性能才能得到用户的青睐
  3. IntelliJ IDEA使用说明
  4. debian部署mysql和tomcat_【超级详细】在Debian/kali/linux服务器下搭建Tomcat7+mysql+jdk8环境...
  5. 我的web聊天之---序章
  6. 大文件分片上传前端框架_基于Node.js的大文件分片上传
  7. 解决torch.cuda.is_available()为False的问题
  8. 网络知识:视频监控传输带宽与存储容量的计算方法
  9. nj08---process、console
  10. list选取多个元素 python_【幼儿园级】0基础学python一本通(上)——AI未来系列1...
  11. UI设计超干货素材!小图标里的大学问!
  12. 游戏音效的发展和制作游戏音效的意义
  13. python 两点曲线_圆锥曲线第八节:直线与椭圆的相交
  14. N-gram详解分析
  15. 【剖析 | SOFARPC 框架】系列之 SOFARPC 序列化比较
  16. c语言将大小写字母互换,C语言编程:大小写互换
  17. Spring-jt-Day05-重定向转发JSON其他框架
  18. C++ 多个指针指向同一个对象
  19. 3.6 Meterpreter 键盘记录
  20. 红米note5解锁教程_红米Note 5A解锁BL教程_红米Note5A获取解锁码进行解锁

热门文章

  1. 深入浅出富文本编辑器
  2. 如何根据LAC和CellID进行手机定位
  3. matlab中长整数表示,matlab – 整数的因式分解
  4. 学校计算机大赛的工作总结,工作总结之中国大学生计算机设计大赛参赛经验与总结...
  5. Maven从入门到放弃
  6. 170902 WarGames-Narnia(8)
  7. Hexo文件压缩:使用hexo-neat插件压缩页面静态资源
  8. 《零基础入门学习Python》读书笔记
  9. 解决火狐下载文件完成,需要等待后才能打开的问题
  10. linux 中 awk sed cut sort 常规操作