使用vs2017搭建CPython3.6和CPython2.7源码调试环境

打算开始看 《Python源码剖析》, 这需要能够本地调试 CPython 的源码

虽然这本书是基于 CPython2.5 的,有点古老了,但大部分还是通用的

这里分别使用 CPython3.6 和 CPython2.7 的源码来调试

这样也能看出 Python2 与 Python3 在源码实现上的一些区别,下面是本次搭建的环境:

  • src:CPython 3.6, CPython2.7
  • os:Win10
  • ide:VS2017

Python循环导入问题

随着 Python 项目的增大,各个模块间的依赖关系将会越来越复杂

如果不合理组织文件模块结构,规划好层级关系,很容易就出现 循环导入(A import B, B import A)

而不幸的是 Python 的包导入机制并没有帮我们检测循环导入(而 Golang 在编译阶段会报错)

一方面我们可以重构(动态一时爽,重构火葬场),借助优秀的设计模式来降低模块间的耦合(最根本)

而另一方面我们可以借助一些小技巧稍微改动代码结构来避免循环导入(治标不治本)

Python字符串驻留机制

由于CPython的优化,有时会发生字符串驻留(intern)

即在某些情况下尝试使用现有的不可变对象而不是每次都创建一个新对象

这些驻留的对象在内部使用类似字典的结构(驻留池)进行驻留

在被驻留之后,许多变量可能指向内存中的相同字符串对象,从而节省内存

下面的代码片段中,字符串是被隐式驻留的,何时隐式驻留字符串取决于字符串本身的特点

也就是说字符串是否会被隐式驻留是有条件的

(至于显式驻留,后面会讲到,以下的 CPython 源码剖析全部基于 CPython3.6)

设计模式之单例模式

由于 Python 拥有灵活的动态语言特性和丰富的魔法方法,

再加上它强大的元类编程,单例模式(Singleton)在 Python 上的实现方式五花八门

本文主要讨论单例模式在 Python 上的各种实现

涉及到 Python 中元类编程、魔法方法和装饰器的进阶语法知识,并在最后深入讨论和总结。

|