https://book.douban.com/subject/3117898/
原书的对应的python版本已经比较老了。06年的文章,python版本是2.5。现在10年过去了,2.x从2.5升到了2.7,并且也有了3.x。
这里做一下读书笔记,记录一下3.5版的源码与原书内容有哪些不同。
打开这本书,在编译时我们就遇到了第一个问题。按书里的说明,只保留python这一个工程,进行一次编译——可以发现编译失败,缺少python35_d.lib(_d说明是调试版本)。这个时候我们看一下源码里的说明文档:
因此在这个版本中,要编译一个最简版本的python,需要编译的工程是pythoncore和python这两个。把pythoncore也一起勾上,再编译就能通过并运行了。
然后书里给出了修改代码的一个例子,让我们修改int类型的int_print()函数,在每次print一个int型的时候,输出一个str。
这里就有不少问题了。python3对内部类型进行了调整,现在既没有int类型,也没有str类型了。python2中,整数有两种类型,一种是系统支持范围内的整数,为int型,一种是变长的long类型,而python3中统一为long类型。同样,str类型也与unicode类型进行了合并。
因此,需要修改的文件是longobject.c这个文件。但打开这个文件之后,是找不到long这个函数的。python中进行print时,系统会在对象的类型对象中查找对应的print函数,我们可以查看一下PyLong_Type,如下图:
tp_print是0,即是空指针,但tp_repr是有一个函数的。因此需要修改的就是这一个函数。string改unicode只需要PyString_FromString改PyUnicode_FromString。另外,PyInt_FromLong需改成PyLong_FromLong。
将这些地方修改之后,就可以运行了。
网友评论