目前学习到第三章PyListObject的内容,在最后一小节Hack PyListObject操作的时候,作者并没有给源代码,这里是我的修改。
static int
list_print(PyListObject *op, FILE *fp, int flags)
{
int rc;
Py_ssize_t i;
PyObject *item;
rc = Py_ReprEnter((PyObject*)op);
if (rc != 0) {
if (rc < 0)
return rc;
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "[...]");
Py_END_ALLOW_THREADS
return 0;
}
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "[");
Py_END_ALLOW_THREADS
for (i = 0; i < Py_SIZE(op); i++) {
item = op->ob_item[i];
Py_INCREF(item);
if (i > 0) {
Py_BEGIN_ALLOW_THREADS
fprintf(fp, ", ");
Py_END_ALLOW_THREADS
}
if (PyObject_Print(item, fp, 0) != 0) {
Py_DECREF(item);
Py_ReprLeave((PyObject *)op);
return -1;
}
Py_DECREF(item);
}
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "]");
Py_END_ALLOW_THREADS
Py_ReprLeave((PyObject *)op);
// -------------------------------
printf("\nallocated=%d, ob_size=%d\n", op->allocated, op->ob_size);
printf("num_free_lists=%d\n", numfree);
// -------------------------------
return 0;
}
修改的代码在// -------------------------------
之间,放在这个函数的其他地方也可以,但是注意不要放在
Py_BEGIN_ALLOW_THREADS
fprintf(fp, "]");
Py_END_ALLOW_THREADS
之间,这块代码之间开启了一个线程,由于我在第一次改代码的时候就已经试过错了,所以不会再犯了,详情请看我的另一篇文章《Python源码剖析》笔记 int_print()
PS.最后查看PyListObject对象缓冲池的使用,也可以在命令行中查看,有一些不同,但效果是一样的。
如图:
或者:
本人是C语言小白,没怎么接触过C语言,现在在研究Python源码,如果有什么错误,欢迎各位大佬指正,感谢!