《Python源码剖析》笔记list_print()

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

猜你喜欢

转载自blog.csdn.net/junkmachine/article/details/115447935