目前学习到第三章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源码,如果有什么错误,欢迎各位大佬指正,感谢!

博主正在研究Python源码,特别是PyListObject的部分。他们分享了自己对`list_print`函数的修改,用于打印PyListObject的内容,并在代码中添加了检查缓冲池使用情况的代码。虽然博主是C语言新手,但他们热衷于探索Python的底层实现,并邀请读者一起探讨可能的错误。
1129

被折叠的 条评论
为什么被折叠?



