字典對(duì)象?
-
PyTypeObject PyDict_Type?
- Part of the Stable ABI.
Python字典類型表示為
PyTypeObject
的實(shí)例。這與Python層面的dict
是相同的對(duì)象。
-
int PyDict_Check(PyObject *p)?
如果 p 是一個(gè) dict 對(duì)象或者 dict 類型的子類型的實(shí)例則返回真值。 此函數(shù)總是會(huì)成功執(zhí)行。
-
int PyDict_CheckExact(PyObject *p)?
如果 p 是一個(gè) dict 對(duì)象但不是 dict 類型的子類型的實(shí)例則返回真值。 此函數(shù)總是會(huì)成功執(zhí)行。
-
PyObject *PyDict_New()?
- Return value: New reference. Part of the Stable ABI.
返回一個(gè)新的空字典,失敗時(shí)返回
NULL
。
-
PyObject *PyDictProxy_New(PyObject *mapping)?
- Return value: New reference. Part of the Stable ABI.
返回
types.MappingProxyType
對(duì)象,用于強(qiáng)制執(zhí)行只讀行為的映射。這通常用于創(chuàng)建視圖以防止修改非動(dòng)態(tài)類類型的字典。
-
void PyDict_Clear(PyObject *p)?
- Part of the Stable ABI.
清空現(xiàn)有字典的所有鍵值對(duì)。
-
int PyDict_Contains(PyObject *p, PyObject *key)?
- Part of the Stable ABI.
確定 key 是否包含在字典 p 中。如果 key 匹配上 p 的某一項(xiàng),則返回
1
,否則返回0
。返回-1
表示出錯(cuò)。這等同于Python表達(dá)式key in p
。
-
PyObject *PyDict_Copy(PyObject *p)?
- Return value: New reference. Part of the Stable ABI.
返回與 p 包含相同鍵值對(duì)的新字典。
-
int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val)?
- Part of the Stable ABI.
使用 key 作為鍵將 val 插入字典 p。 key 必須為 hashable;如果不是,則將引發(fā)
TypeError
。 成功時(shí)返回0
,失敗時(shí)返回-1
。 此函數(shù) 不會(huì) 附帶對(duì) val 的引用。
-
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)?
- Part of the Stable ABI.
使用 key 作為鍵將 val 插入到字典 p。 key 應(yīng)當(dāng)為 const char*。 鍵對(duì)象是使用
PyUnicode_FromString(key)
創(chuàng)建的。 成功時(shí)返回0
,失敗時(shí)返回-1
。 此函數(shù) 不會(huì) 附帶對(duì) val 的引用。
-
int PyDict_DelItem(PyObject *p, PyObject *key)?
- Part of the Stable ABI.
移除字典 p 中鍵為 key 的條目。 key 必須是可哈希的;如果不是,則會(huì)引發(fā)
TypeError
。 如果字典中沒有 key,則會(huì)引發(fā)KeyError
。 成功時(shí)返回0
,失敗時(shí)返回-1
。
-
int PyDict_DelItemString(PyObject *p, const char *key)?
- Part of the Stable ABI.
移除字典 p 中由字符串 key 指定的鍵的條目。 如果字典中沒有 key,則會(huì)引發(fā)
KeyError
。 成功時(shí)返回0
,失敗時(shí)返回-1
。
-
PyObject *PyDict_GetItem(PyObject *p, PyObject *key)?
- Return value: Borrowed reference. Part of the Stable ABI.
從字典 p 中返回以 key 為鍵的對(duì)象。 如果鍵名 key 不存在但 沒有 設(shè)置一個(gè)異常則返回
NULL
。需要注意的是,調(diào)用
__hash__()
和__eq__()
方法產(chǎn)生的異常不會(huì)被拋出。改用PyDict_GetItemWithError()
獲得錯(cuò)誤報(bào)告。在 3.10 版更改: 在不保持 GIL 的情況下調(diào)用此 API 曾因歷史原因而被允許。 現(xiàn)在已不再被允許。
-
PyObject *PyDict_GetItemWithError(PyObject *p, PyObject *key)?
- Return value: Borrowed reference. Part of the Stable ABI.
PyDict_GetItem()
的變種,它不會(huì)屏蔽異常。 當(dāng)異常發(fā)生時(shí)將返回NULL
并且 設(shè)置一個(gè)異常。 如果鍵不存在則返回NULL
并且不會(huì) 設(shè)置一個(gè)異常。
-
PyObject *PyDict_GetItemString(PyObject *p, const char *key)?
- Return value: Borrowed reference. Part of the Stable ABI.
這與
PyDict_GetItem()
一樣,但是 key 被指定為 const char*,而不是 PyObject*。需要注意的是,調(diào)用
__hash__()
、__eq__()
方法和創(chuàng)建一個(gè)臨時(shí)的字符串對(duì)象時(shí)產(chǎn)生的異常不會(huì)被拋出。改用PyDict_GetItemWithError()
獲得錯(cuò)誤報(bào)告。
-
PyObject *PyDict_SetDefault(PyObject *p, PyObject *key, PyObject *defaultobj)?
- Return value: Borrowed reference.
這跟Python層面的
dict.setdefault()
一樣。如果鍵 key 存在,它返回在字典 p 里面對(duì)應(yīng)的值。如果鍵不存在,它會(huì)和值 defaultobj 一起插入并返回 defaultobj 。這個(gè)函數(shù)只計(jì)算 key 的哈希函數(shù)一次,而不是在查找和插入時(shí)分別計(jì)算它。3.4 新版功能.
-
PyObject *PyDict_Items(PyObject *p)?
- Return value: New reference. Part of the Stable ABI.
返回一個(gè)包含字典中所有鍵值項(xiàng)的
PyListObject
。
-
PyObject *PyDict_Keys(PyObject *p)?
- Return value: New reference. Part of the Stable ABI.
返回一個(gè)包含字典中所有鍵(keys)的
PyListObject
。
-
PyObject *PyDict_Values(PyObject *p)?
- Return value: New reference. Part of the Stable ABI.
返回一個(gè)包含字典中所有值(values)的
PyListObject
。
-
Py_ssize_t PyDict_Size(PyObject *p)?
- Part of the Stable ABI.
返回字典中項(xiàng)目數(shù),等價(jià)于對(duì)字典 p 使用
len(p)
。
-
int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)?
- Part of the Stable ABI.
迭代字典 p 中的所有鍵值對(duì)。 在第一次調(diào)用此函數(shù)開始迭代之前,由 ppos 所引用的
Py_ssize_t
必須被初始化為0
;該函數(shù)將為字典中的每個(gè)鍵值對(duì)返回真值,一旦所有鍵值對(duì)都報(bào)告完畢則返回假值。 形參 pkey 和 pvalue 應(yīng)當(dāng)指向 PyObject* 變量,它們將分別使用每個(gè)鍵和值來填充,或者也可以為NULL
。 通過它們返回的任何引用都是暫借的。 ppos 在迭代期間不應(yīng)被更改。 它的值表示內(nèi)部字典結(jié)構(gòu)中的偏移量,并且由于結(jié)構(gòu)是稀疏的,因此偏移量并不連續(xù)。例如:
PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(self->dict, &pos, &key, &value)) { /* do something interesting with the values... */ ... }
字典 p 不應(yīng)該在遍歷期間發(fā)生改變。在遍歷字典時(shí),改變鍵中的值是安全的,但僅限于鍵的集合不發(fā)生改變。例如:
PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(self->dict, &pos, &key, &value)) { long i = PyLong_AsLong(value); if (i == -1 && PyErr_Occurred()) { return -1; } PyObject *o = PyLong_FromLong(i + 1); if (o == NULL) return -1; if (PyDict_SetItem(self->dict, key, o) < 0) { Py_DECREF(o); return -1; } Py_DECREF(o); }
-
int PyDict_Merge(PyObject *a, PyObject *b, int override)?
- Part of the Stable ABI.
對(duì)映射對(duì)象 b 進(jìn)行迭代,將鍵值對(duì)添加到字典 a。 b 可以是一個(gè)字典,或任何支持
PyMapping_Keys()
和PyObject_GetItem()
的對(duì)象。 如果 override 為真值,則如果在 b 中找到相同的鍵則 a 中已存在的相應(yīng)鍵值對(duì)將被替換,否則如果在 a 中沒有相同的鍵則只是添加鍵值對(duì)。 當(dāng)成功時(shí)返回0
或者當(dāng)引發(fā)異常時(shí)返回-1
。
-
int PyDict_Update(PyObject *a, PyObject *b)?
- Part of the Stable ABI.
這與 C 中的
PyDict_Merge(a, b, 1)
一樣,也類似于 Python 中的a.update(b)
,差別在于PyDict_Update()
在第二個(gè)參數(shù)沒有 "keys" 屬性時(shí)不會(huì)回退到迭代鍵值對(duì)的序列。 當(dāng)成功時(shí)返回0
或者當(dāng)引發(fā)異常時(shí)返回-1
。
-
int PyDict_MergeFromSeq2(PyObject *a, PyObject *seq2, int override)?
- Part of the Stable ABI.
將 seq2 中的鍵值對(duì)更新或合并到字典 a。 seq2 必須為產(chǎn)生長度為 2 的用作鍵值對(duì)的元素的可迭代對(duì)象。 當(dāng)存在重復(fù)的鍵時(shí),如果 override 真值則最后出現(xiàn)的鍵勝出。 當(dāng)成功時(shí)返回
0
或者當(dāng)引發(fā)異常時(shí)返回-1
。 等價(jià)的 Python 代碼(返回值除外):def PyDict_MergeFromSeq2(a, seq2, override): for key, value in seq2: if override or key not in a: a[key] = value