Python C API 使用详解(二)

简介

介绍Python C API中的列表、元组、字典的使用,详细的进行了API中方法的介绍。

Python List API

List API 简单介绍

int PyList_Check(PyObject *p) 判断是否是一个Python List(列表)

PyObject* PyList_New(Py_ssize_t len) 创建一个列表

Py_ssize_t PyList_Size(PyObject *list) 获取列表元素的个数 len(list)

Py_ssize_t PyList_GET_SIZE(PyObject *list) 和PyList_Size 一样,但是就是没有错误检查

PyObject PyList_GetItem(PyObject list, Py_ssize_t index) 从列表里面获取一个元素,计数器不会加1

PyObject PyList_GET_ITEM(PyObject list, Py_ssize_t i) 和PyList_GetItem一样,但是就是没有错误检查

int PyList_SetItem(PyObject list, Py_ssize_t index, PyObject item) 设置别表指定位置的值,下标的所在的位置必须是有值的,并且是有效的

void PyList_SET_ITEM(PyObject list, Py_ssize_t i, PyObject o) 和PyList_SetItem一样,但是就是没有错误检查

int PyList_Insert(PyObject list, Py_ssize_t index, PyObject item) 在列表指定位置插入值 list.insert(index, item)

int PyList_Append(PyObject list, PyObject item) 在列表尾部追加值 list.append(item)

PyObject PyList_GetSlice(PyObject list, Py_ssize_t low, Py_ssize_t high) 获取列表里面一段切片数据,一段指定范围的数据 list[low:higt]

int PyList_SetSlice(PyObject list, Py_ssize_t low, Py_ssize_t high, PyObject itemlist) 设置列表分片数据,指定列表范围的数据 list[low:higt] = itemlist

int PyList_Sort(PyObject *list) 对列表数据进行排序 list.sort()

int PyList_Reverse(PyObject *list) 把列表里面的所有数据反转 list.reverse()

PyObject PyList_AsTuple(PyObject list) 将Python列表转为Python元组 tuple(list)

实例

注意事项: 不限制大小的Python列表对象,应该用Append初始化数据

设置大小的Python列表对象,应该用SetItem初始化数据, 如果用Append的话,会出现” 段错误 (核心已转储) “的情况

头文件

源文件

Python Tuple API

Tuple API 简单介绍

int PyTuple_Check(PyObject *p) 判断是否是一个元组对象

PyObject* PyTuple_New(Py_ssize_t len) 创建一个Python元组对象,注意元组创建是必须设置长度的,如果设置长度为0,则这个元组对象是一个空的元组

Py_ssize_t PyTuple_Size(PyObject *p) 获取元组的长度,即元组的大小

Py_ssize_t PyTuple_GET_SIZE(PyObject *p) 和PyTuple_Size一样,只不过这个方法没有错误检查的机制

PyObject PyTuple_GetItem(PyObject p, Py_ssize_t pos) 获取元组内指定下标的值

PyObject PyTuple_GET_ITEM(PyObject p, Py_ssize_t pos) 和PyTuple_GetItem一样,只不过这个方法没有错误检查的机制

PyObject PyTuple_GetSlice(PyObject p, Py_ssize_t low, Py_ssize_t high) 获取分片数据 p[lwo, higt]

int PyTuple_SetItem(PyObject p, Py_ssize_t pos, PyObject o) 设置元组指定下标的值

void PyTuple_SET_ITEM(PyObject p, Py_ssize_t pos, PyObject o) 和PyTuple_SetItem一样,只不过这个方法没有错误检查的机制

int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize) 改变元组的大小

实例

头文件

源文件

Python Dict API

Dict API 简单介绍

int PyDict_Check(PyObject *p) 判断对象是不是一个字典

PyObject* PyDict_New() 创建一个Python对象

void PyDict_Clear(PyObject *p) 清空Python对象的数据

int PyDict_Contains(PyObject p, PyObject key) 判断字典内是否存在一个键值数据

PyObject PyDict_Copy(PyObject p) 拷贝一个字典的数据,产生一个新的Python字典对象

int PyDict_SetItem(PyObject p, PyObject key, PyObject *val) 给Python字典对象设置新的键值数据

int PyDict_SetItemString(PyObject p, const char key, PyObject *val) 和PyDict_SetItem类似,只不过键是C语言char数据类型的数据

int PyDict_DelItem(PyObject p, PyObject key) 删除Python键值数据

int PyDict_DelItemString(PyObject p, const char key) 和PyDict_DelItem类似,只不过键是C语言char数据类型的数据

PyObject PyDict_GetItem(PyObject p, PyObject *key) 获取Python字典对象的键的值

PyObject PyDict_GetItemWithError(PyObject p, PyObject *key) 和PyDict_GetItem一样,只不过返回上下文的错误信息

PyObject PyDict_GetItemString(PyObject p, const char *key) 和PyDict_GetItem一样,只不过键值C语言中char数据类型的数据

PyObject PyDict_SetDefault(PyObject p, PyObject key, PyObject default) 设置Python字典对象的默认值,当获取的Key不存在的时候则返回当前的默认数据 dict.setdefault()

PyObject PyDict_Items(PyObject p) 返回一个Python字典对象所有数据的PyListObject, dict.items()

PyObject PyDict_Keys(PyObject p) 返回一个Python字典对象的所有的Key数据 dict.keys()

PyObject PyDict_Values(PyObject p) 返回一个Python字典对象的所有Value数据 dict.values()

Py_ssize_t PyDict_Size(PyObject *p) 获取Python字典的大小 len(dict)

int PyDict_Next(PyObject p, Py_ssize_t ppos, PyObject pkey, PyObject pvalue) 遍历获取Python字典对象的所有数据, 下面是官方提供的例子

int PyDict_Merge(PyObject a, PyObject b, int override) 将b字典内的数据,加入到a字典中去,override表示是否覆盖数据,如果override为true则覆盖数据,反之亦然

int PyDict_Update(PyObject a, PyObject b) 把b字典中的数据加入到a字典中,如果a和b出现相同的key,则b直接更新a中key对应的值

实例

头文件

源文件

根据数据类型打印数据的方法

头文件

源文件

main函数

本文为原创文章,未经授权禁止转载本站文章。
原文出处:兰玉磊的个人博客
原文链接:https://www.fdevops.com/2020/03/08/python-c-api-2
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

发表评论

邮箱地址不会被公开。 必填项已用*标注