1. 程式人生 > >python 原始碼解析(一)

python 原始碼解析(一)

為了看懂 python 原始碼 ,特地學了 c++ ,依然看不懂,看了個大概,先留個坑,慢慢填。

先從 python dict 物件開始看起。

python dict 物件  是鍵值對的 一種結構,類似於 java 的hashmap 物件。

dictd 物件 , 每個鍵值對 ,被 c 的 struct 結構定義,兩個指標,一個指向key ,另一個 指向value.

typedef struct {
	long me_hash;
	PyObject *me_key;
	PyObject *me_value;
#ifdef USE_CACHE_ALIGNED
	long	aligner;
#endif
} dictentry

而 定義字典得 struct 是這樣的。

struct dictobject {
	PyObject_HEAD
	int ma_fill;
	int ma_used;
	int ma_size;
	int ma_poly;
	dictentry *ma_table;
	dictentry *(*ma_lookup)(dictobject *mp, PyObject *key, long hash);
};

dictentry *ma_table;  是一個 dictentry 的 指標。

而  字典 是 採用開放定址法,dict 建立過程,mp->ma_size = 0;
    mp->ma_poly = 0;
    mp->ma_table = NULL;
    mp->ma_fill = 0;
    mp->ma_used = 0;

分別用 ma_size  ma_table  等幾個 欄位 記錄狀態。這是 ma_table 為 null , 表明 字典 裡還沒有鍵值對。

yDict_New(void)
{
	register dictobject *mp;
	if (dummy == NULL) { /* Auto-initialize dummy */
		dummy = PyString_FromString("<dummy key>");
		if (dummy == NULL)
			return NULL;
#ifdef SHOW_CONVERSION_COUNTS
		Py_AtExit(show_counts);
#endif
	}
	mp = PyObject_NEW(dictobject, &PyDict_Type);
	if (mp == NULL)
		return NULL;
	mp->ma_size = 0;
	mp->ma_poly = 0;
	mp->ma_table = NULL;
	mp->ma_fill = 0;
	mp->ma_used = 0;
	mp->ma_lookup = lookdict_string;
#ifdef SHOW_CONVERSION_COUNTS
	++created;
#endif
	PyObject_GC_Init(mp);
	return (PyObject *)mp;
}

太晚了 頭暈 ,明天再說。