1. 程式人生 > >Python/C API 具體物件層(部分)

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型別或其子型別返回true

  • int PyFloat_CheckExact(PyObject *p)
    當引數p為且僅為PyFloatObject型別時返回true

  • PyObject* 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物件或其子物件,返回true

  • int 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)
    清空一個集合。