howdoi 源码阅读与分析
howdoi – 一款通过命令行帮你从 stackoverflow 中寻找答案的工具,其源代码部分不足 300 行。同时,这份代码被 The Hitchhiker’s Guide to Python! 推荐为适合新手源码阅读的代码。因此,在读完源码后,我分享一下我对这份代码的理解。
这里采用的版本是 tree 中标号为 d84afdee60 的那一版
howdoi – 一款通过命令行帮你从 stackoverflow 中寻找答案的工具,其源代码部分不足 300 行。同时,这份代码被 The Hitchhiker’s Guide to Python! 推荐为适合新手源码阅读的代码。因此,在读完源码后,我分享一下我对这份代码的理解。
这里采用的版本是 tree 中标号为 d84afdee60 的那一版
Python 对函数默认参数的处理
一个以可变对象为默认参数的函数:
1 | class A: |
从结果可以看出,Python 在解析时便已经创建好了默认参数 a 的值。函数 f 在调用时采用了同一个对象,而不是每次调用时重新创建新的对象。这一点与 C++
的处理方式不同。
简单的说, CPython
是 Python 解释器的一个实现。换句话说,Python 解释器是由 C 写的,然后由 GCC 之类的编译器编译而成的可执行文件。除了 CPython,还有 PyPy(用 Python 实现的 Python 解释器),Skulpt(用 JavaScript 实现的 Python 解释器) 等等。如果你不知道你用的是哪一个,那么你一定用的就是 CPython。因为 CPython 是 Python 官方的解释器实现,其它均属于第三方实现。
对于从 Python 源码到解释器执行它们的这个过程,我把它分为两大步 —— 编译(Compiling) 与 解释(Interpreting)。
在 SICP 第 3 章中,有一段部分内容是以 stream 为核心而展开的。而 stream 的特点就是 lazy evaluation / delayed evaluation (惰性求值 / 延迟计算)。在接触 stream 之时,我便立即联想到 Python 具有类似的功能 — yield
。
乍一看之下,@staticmethod 与 @classmethod 真的很相似,貌似都可以看作是静态函数,除了后者必须有一个传入参数外就貌似没区别了。但既然加入了,那也一定有开发者的考虑了。