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)
清空一个集合。