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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值