Python/C API 具體物件層(部分)
1 空物件
- PyObject *Py_None
Python程式碼中的None物件。 - Py_RETURN_NONE
巨集定義:#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
Python/C API 不能直接處理空物件,所以要檢查,可在C程式碼中用“==”進行比較。
2 數字物件
2.1 整數物件
PyLongObject
PyObject的子類,表示整數物件。PyTypeObject PyLong_Type
PyTypeObject的一個例項,表示Python整數型別。int PyLong_Check(PyObject *p)
若引數p為PyLongObject或PyLongObject的子類,則返回true。int PyLong_CheckExact(PyObject *p)
若p是且僅是PyLongObject,則返回true。PyObject * PyLong_FromLong(long v)
- PyObject * PyLong_FromUnsignedLong(unsigned long v)
- PyObject * PyLong_FromSize_t(size_t v)
- PyObject * PyLong_FromSsize_t(Py_ssize_t v)
- PyObject * PyLong_FromDouble(double v)
- PyObject * PyLong_FromtString(const char *str, char **pend, int base)
PyObject* PyLong_FromVoidPtr(void *p)
long PyLong_AsLong(PyObject *obj)
- unsigned long PyLong_AsUnsignedLong(PyObject *pylong)
- size_t PyLong_AsSize_t(PyObject *pylong)
- Py_ssize_t PyLong_AsSsize_t(PyObject *pylong)
- double PyLong_AsDouble(PyObject *pylong)
- void* PyLong_AsVoidPtr(PyObject *pylong)
2.2 Boolean物件
- int PyBool_Check(PyObject *o)
檢查物件o是否為PyBool_Type型別,若是返回true - PyObject* Py_False
Python的False物件。 - PyObject* Py_True
Python的True物件。 - Py_RETURN_FALSE
巨集定義:#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False - Py_RETURN_TRUE
巨集定義:#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True - PyObject* PyBool_FromLong(long v)
返回一個新引用,將v轉換為bool物件。
2.3 浮點物件
- PyFloatObject
PyObject的子類,表示浮點物件。 PyTypeObject PyFloat_Type
int PyFloat_Check(PyObject *p)
若引數p為PyFloatObject型別或其子型別返回trueint PyFloat_CheckExact(PyObject *p)
當引數p為且僅為PyFloatObject型別時返回truePyObject* PyFloat_FromString(PyObject *str)
由字串物件構建浮點物件PyObject* PyFloat_FromDouble(double v)
由double構造浮點物件double PyFloat_AsDouble(PyObject *pyfloat)
pyfloat轉換為double,失敗返回-1.0。double PyFloat_AS_DOUBLE(PyObject *pyfloat)
pyfloat轉換為double,無異常檢查。double PyFloat_GetMax()
返回C語言中最大的double數值。- double PyFloat_GetMin()
返回最小的正double數值。
3 序列物件
3.1 元組物件
- PyTupleObject
PyObject的子類,表示Python的元組型別。 PyTypeObject PyTuple_Type
int PyTuple_Check(PyObject *p)
檢查物件p是否為PyTupleObject型別或其子類,是則返回true。int PyTuple_CheckExact(PyObject *p)
當且僅當物件p為PyTupleObject型別時,返回true。PyObject * PyTuple_New(Py_ssize_t len)
返回一個大小為len的元組的新的引用,失敗返回NULL。- PyObject * PyTuple_Pack(Py_ssize_t n, …)
建立並返回一個大小為n的元組的新的引用,失敗返回NULL。元組的內容會被初始化。PyTuple_Pack(2, a, b)等價於Py_BuildValue(“(oo), a, b)*。 - Py_ssize_t PyTuple_Size(PyObject *p)
返回元組p的大小。 - Py_ssize_t PyTuple_GET_SIZE(PyObject *p)
返回元組p的大小,無錯誤檢查。 - PyObject * PyTuple_GetItem(PyObject *p, Py_ssize_t pos)
返回borrowed引用,查詢元組p中第pos個元素,出錯返回NULL。 - PyObject * PyTuple_GET_ITEM(PyObject *p, Py_ssize_t pos)
返回borrowed引用,查詢元組p中第pos個元素,無出錯檢查。 - PyObject* PyTuple_GetSlice(PyObject *p, Py_ssize_t low, Py_ssize_t high)
獲得分片的一個新引用,返回值是一個元組。 - int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)
將元組p的第pos個元素設為物件o,注意,該函式會偷走o的一個引用。 - void PyTuple_SET_ITEM( PyObject *p, Py_ssize_t pos, PyObject *o)
將元組p的第pos個元素設為物件o,注意,該函式會偷走o的一個引用。無錯誤檢查。 - int _PyTuple_Resize( PyObject **p, Py_ssize_t newsize)
重置元組p的大小。因為元組被設定為不可變的,所以當且僅當該元組的引用計數為1時才可使用該函式,返回0表示成功,失敗返回-1並丟擲異常。
3.2 list物件
- PyListObject
PyObject的子類,表示python的list物件。 PyTypeObject PyList_Type
int PyList_Check(PyObject *p)
若物件p為list物件或其子類物件,返回true。int PyList_CheckExact(PyObject *p)
當且僅當物件p為list物件是返回true。PyObject * PyList_New(Py_ssize_t len)
建立一個大小為len的list並返回一個新引用,失敗返回NULL。- Py_ssize_t PyList_Size(PyObject *list)
返回list的大小,等價於len(list)。 - Py_ssize_t PyList_GET_SIZE(PyObject *list)
返回list的大小,無錯誤檢查。 - PyObject * PyList_GetItem(PyObject *list, Py_ssize_t index)
返回一個borrowed引用,獲取list的第index個元素,index一定要為正數。出錯返回NULL並丟擲異常。 - PyObject * PyList_GET_ITEM(PyObject *list, Py_ssize_t i)
返回一個borrowed引用,獲取list的第index個元素,index一定要為正數。無錯誤檢查。 - int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item)
將list第index個元素設為item,成功返回0,失敗返回-1。該函式會偷走item的一個引用。 - void PyList_SET_ITEM(PyObject *list, Py_ssize_t i, PyObject *o)
將list第index個元素設為item,該巨集會偷走item的一個引用。 - int PyList_Insert(PyObject *list, Py_ssize_t index, PyObject *item)
在list的index位置插入新元素item,成功返回0,失敗返回-1並丟擲異常。list.insert(index, item) - int PyList_Append(PyObject *list, PyObject *item)
在list末尾新增元素item,成功返回0,失敗返回-1並丟擲異常。list.append(item) - PyObject * PyList_GetSlice(PyObject *list, Py_ssize_t low, Py_ssize_t high)
返回一個新引用,返回值為list型別,失敗返回NULL。list[low:high] - int PyList_SetSlice(PyObject *list, Py_ssize_t low, Py_ssize_t high, PyObject *itemlist)
設定分片,成功返回0,失敗返回-1,itemlist可為NULL,表示清空。 - int PyList_Sort(PyObject *list)
對list進行排序,成功返回0,失敗返回-1。list.sort() - int PyList_Reverse(PyObject *list)
翻轉list,成功返回0,失敗返回-1。list.reverse() - PyObject * PyList_AsTuple(PyObject *list)
依據list構造出一個元組,並返回該元組的一個新引用。tuple(list)
3.3 Bytes物件
- PyBytesObject
PyObject的子類,表示一個bytes物件 PyTypeObject PyBytes_Type
int PyBytes_Check(PyObject *o)
若物件o是bytes物件或其子物件,返回trueint PyBytes_CheckExact(PyOjbect *o)
當且僅當物件o為bytes物件時返回true。PyObject * PyBytes_FromString(const char *v)
從字串v拷貝資料並構造一個bytes物件並返回,失敗返回NULL,v不能為NULL。- PyObject * PyBytes_FromStringAndSize(const char *v, Py_ssize_t len)
從字串v拷貝長度len的資料並構造一個bytes物件並返回,失敗返回NULL。若v為NULL,長度len的bytes物件不會初始化。 - PyObject * PyBytes_FromFormat(const char *format, …)
C語言printf()樣式構造一個bytes物件,失敗返回NULL。 - PyObject * PyBytes_FromFormatV(const char *format, va_list vargs)
與上者類似。 - Py_ssize_t PyBytes_Size(PyObject *o)
bytes物件o的位元組數。 - Py_ssize_t PyBytes_GET_SIZE(PyObject *o)
bytes物件o的位元組數,無錯誤檢查。 - char * PyBytes_AsString(PyObject *o)
返回一個指向物件o內部buffer的指標,該內部buffer含有len(o)+1個位元組,最後一個位元組為NULL。一定不能通過指標改變內部buffer,但如果物件o使用函式PyBytes_FromStringAndSize(NULL, size)建立,則可進行修改。不能通過返回的指標釋放記憶體,若有錯則返回NULL。
3.4 bytearray物件
- PyByteArrayObject
PyObject的子型別,表示一個bytearray物件。 PyTypeObject PyByteArray_Type
int PyByteArray_Check(PyObject *o)
若物件o為PyByteArrayObject型別,或其子型別,返回true。int PyByteArray_CheckExact(PyObject *o)
當且僅當物件o為PyByteArrayObject型別時返回true。PyObject * PyByteArray_FromStringAndSize(const char *string, Py_ssize_t len)
從string構造一個長度為len的bytearray物件並返回,失敗返回NULL。- PyObject * PyByteArray_Concat(PyObject *a, PyObject *b)
拼接a和b並返回一個新的bytearray。 - Py_ssize_t PyByteArray_Size(PyObject *bytearray)
若bytearray不為NULL,則返回其大小。 - char *PyByteArray_AsString(PyObject *bytearray)
若bytearray不為NULL,返回以字元陣列的形式返回其內容,返回的字元陣列最後會新增一個額外的NULL。 - int PyByteArray_Resize(PyObject *bytearray, Py_ssize_t len)
將bytearray內部buffer的大小重置為len。
4 容器物件
4.1 字典物件
- PyDictObject
PyObject的子類,表示python字典物件。 PyTypeObject PyDict_Type
int PyDict_Check(PyObject *p)
若p為PyDictObject型別或其子類,返回true。int PyDict_CheckExact(PyObject *p)
當且僅當p為PyDictObject型別時,返回true。PyObject * PyDict_New()
返回一個新的空字典的新引用,失敗返回NULL。- void PyDict_Clear(PyObject *p)
清空字典p。 - int PyDict_Contains(PyObject *p, PyObject *key)
檢查字典p是否包含鍵key,有則返回1,無則返回0,失敗返回-1。key in p。 - PyObject * PyDict_Copy(PyObject *p)
將字典p拷貝一份,生成一個新字典並返回其引用。 - int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val)
在字典p中新增鍵值對key、val,key必須是hashable。成功返回0,失敗返回-1並丟擲異常。 - int PyDict_DelItem(PyObject *p, PyObject *key)
在字典p中刪除鍵key,key必須是可hashable。成功返回0,失敗返回-1並丟擲異常。 - PyObject * PyDict_GetItem(PyObject *p, PyObject *key)
返回borrowed引用。從字典p中查詢鍵key,找到返回value的borrowed引用,找不到返回NULL,不丟擲異常。 - PyObject * PyDict_Items(PyObject *p)
返回一個新引用,指向一個包含所有item的PyListObject物件。
-PyObject * PyDict_Keys(PyObject *p)
返回一個新引用,指向一個包含所有鍵的PyListObject物件。 - PyObject * PyDict_Values(PyObject *p)
返回一個新引用,指向一個包含所有值得PyListObject物件。 - Py_ssize_t PyDict_Size(PyObject *p)
返回字典p中item的數量,len(p) - int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
遍歷一個字典p,ppos必須提前設定為0,pkey和pvalue為返回的鍵和值,並均為borrowed的引用。在遍歷過程中,不許進行對鍵有影響的操作。成功返回true
PyObject *key, *value;
Py_ssize_t pos = 0;
while (PyDict_Next(self->dict, &pos, &key, &value))
{
long i = PyLong_AsLong(value);
if (i == -1 && PyError_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)
將b合併至a,若override==true,則b中重複的鍵將覆蓋a中對應的鍵,否則只將b中無衝突的鍵新增至a。成功返回0,失敗返回-1。 - int PyDict_MergeFromSeq2(PyObject *a, PyObject *seq2, int override)
成功返回0,失敗返回-1。等價於
def PyDict_MergeFromSeq2(a, seq2, override)
for key, value in seq2:
if override or key not in a:
a[key] = value
4.2 集合物件
- PySetObject
PyObject的子類,表示set或frozenset。 PyTypeObject PySet_Type
int PySet_Check(PyObject *p)
檢查p是否為set或其子類,若是則返回true。PyObject * PySet_New(PyObject *iterable)
返回一個新引用。返回的是一個新的set,若iterable不為NULL則由新的集合的內容由iterable返回,若iterable為NULL,則生成一個空set。失敗返回NULL。- Py_ssize_t PySet_Size(PyObject *anyset)
返回集合的大小。等價於len(anyset)。失敗返回-1,並丟擲異常。 - Py_ssize_t PySet_GET_SIZE(PyObject *anyset)
返回集合的大小,巨集實現,無錯誤檢查。 - int PySet_Contains(PyObject *anyset, PyObject *key)
若在集合中找到key,則返回1,找不到返回0,發生錯誤返回-1。 - int PySet_Add(PyObject *set, PyObject *key)
在集合中新增元素key,成功返回0,失敗返回-1。 - int PySet_Discard(PyObject *set, PyObject *key)
在集合set中刪除key,成功返回1,失敗返回-1,沒找到返回0。 - PyObject * PySet_Pop(PyObject *set)
從集合中返回任意一個元素的引用,並從集合中刪除該物件。 - int PySet_Clear(PyObject *set)
清空一個集合。