目前學習到第三章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原始碼,如果有什么錯誤,歡迎各位大佬指正,感謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272799.html
標籤:其他
