Python/C API 抽象对象层(部分)

1 对象

  • int PyObject_HasAttr(PyObject *o, PyObject *attr_name)
  • int PyObject_HasAttr(PyObject *o, const char *attr_name)
    若对象o含有属性attr_name则返回1,否则返回0。等价与Python函数hasattr(o, attr_name)。该函数正常不会出问题。

  • PyObject * PyObject_GetAttr(PyObject *o, PyObject *attr_name)

  • PyObject * PyObject_GetAttrString(PyObject *o, const char *attr_name)
    返回一个新引用,该引用是对象o中名为attr_name的属性,失败返回NULL。等价与o.attr_name()

  • int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v)

  • int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)
    设置对象o的属性attr_name为v,失败返回-1。等价于o.attr_name=v

  • int PyObject_DelAttr(PyObject *o, PyObject *attr_name)

  • int PyObject_DelAttrString(PyObject *o, const char *attr_name)
    从对象o中移除对象属性attr_name,失败返回-1。等价于del o.attr_name

  • int PyObject_IsInstance(PyObject *inst, PyObject *cls)
    若inst是cls的实例或是cls的子类,则返回1,否则返回0。
    若cls是元组,则inst会与cls中的每一项进行比较,若元组中最后一项匹配成功则返回1,否则返回0。

  • PyObject * PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw)
    返回执行结果的一个新引用,失败返回NULL。调用Python对象callable_object,args是一个参数元组,命名参数kw是一个字典,若元组参数args不需要,则将args设为空元组,若不需要命名参数,则kw设为NULL。等价于callable_object(*args, **kw)

  • PyObject * PyObject_CallObject(PyObject *callable_object, PyObject *args)
    返回执行结果的一个新引用,失败返回NULL。args为一个元组,若不需要参数,args设为NULL。等价于callable_object(*args)

  • PyObject * PyObject_CallFunction(PyObject *callable_object, const char *format, …)
    返回执行结果的一个新引用,失败返回NULL。参数format的形式与函数Py_BuildValue()一样,并可以为NULL。等价于callable(*args)

  • PyObject * PyObject_CallMethod(PyObject *o, const char *method, const char *format, …)
    返回执行结果的一个新引用,失败返回NULL。调用对象o的成员函数method,等价于o.method(args),从3.4版本开始method和format改为char *。

  • PyObject * PyObject_CallFunctionObjArgs(PyObject *callable, …, NULL)
    返回执行结果的一个新引用,失败返回NULL。调用对象callable,参数是若干个PyObject对象,以NULL结尾。

  • PyObject * PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, …, NULL)
    返回执行结果的一个新引用,失败返回NULL。调用对象o的函数name,参数与PyObject_CallFunctionObjArg()一样。

  • Py_hash_t PyObject_Hash(PyObject *o)
    计算并返回对象o的hash值,失败返回-1。等价于hash(o)

  • int PyObject_IsTrue(PyObject *o)
    若对象o可转为true则返回1,否则返回0,有异常返回-1。等价于not not 0

  • int PyObject_Not(PyObject *o)
    若对象o可转为true则返回0,否则返回1,又一场返回-1。等价于not o

  • PyObject * PyObject_Type(PyObject *o)
    若对象o非NULL,返回对象o对应的类型对象的一个新引用,失败抛出SystemError并返回NULL。等价于type(o)

  • int PyObject_TypeCheck(PyObject *o, PyTypeObject *type)
    若对象o的类型为type或type的子类,则返回true,两个参数都不能为NULL。

  • Py_ssize_t PyObject_Length(PyObject *o)

  • Py_ssize_t PyObject_Size(PyObject *o)
    返回对象o的长度,无论对象o是序列还是字典都返回其长度,出错返回-1。等价于len(o)

  • PyObject * PyObject_GetItem(PyObject *o, PyObject *key)
    成功返回对象o中键为key的元素的一个新引用,失败返回NULL。等价于o[key]

  • int PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v)
    等价于o[key]=v,失败返回-1。

  • int PyObject_DelItem(PyObject *o, PyObject *key)
    从对象o中删除key对应的元素,失败返回-1。等价于del o[key]

  • PyObject * PyObject_GetIter(PyObject *o)
    返回一个新的引用,等价于iter(o)。返回对象o的一个新的iterator,若参数o已经是iterator,则直接返回o本身。若有异常则抛出TypeError并返回NULL。

2 数字

  • int PyNumber_Check(PyObject *o)
    若对象o提供了数字protocol则返回1,否则返回0。

  • PyObject* PyNumber_Add(PyObject *o1, PyObject *o2)
    返回o1 + o2

  • PyObject* PyNumber_Subtract(PyObject *o1, PyObject *o2)
    返回o1 - o2
  • PyObject* PyNumber_Multiply(PyObject *o1, PyObject *o2)
    返回o1 * o2
  • PyObject* PyNumber_FloorDivide(PyObject *o1, PyObject *o2)
    返回o1 // o2
  • PyObject* PyNumber_TrueDivide(PyObject *o1, PyObject *o2)

  • PyObject* PyNumber_Remainder(PyObject *o1, PyObject *o2)
    返回o1 % o2

  • PyObject* PyNumber_Divmod(PyObject *o1, PyObject *o2)
    返回divmod(o1, o2)
  • PyObject* PyNumber_Power(PyObject *o1, PyObject *o2, PyObject *o3)
    返回pow(o1, o2, o3)
  • PyObject* PyNumber_Negative(PyObject *o)
    返回-o
  • PyObject* PyNumber_Positive(PyObject *o)
    返回+o
  • PyObject* PyNumber_Absolute(PyObject *o)
    返回abs(o)
  • PyObject* PyNumber_Invert(PyObject *o)
    返回~o
  • PyObject* PyNumber_Lshift(PyObject *o1, PyObject *o2)
    返回o1 << o2
  • PyObject* PyNumber_Rshift(PyObject *o1, PyObject *o2)
    返回o1 >> o2
  • PyObject* PyNumber_And(PyObject *o1, PyObject *o2)
    返回o1 & o2
  • PyObject* PyNumber_Xor(PyObject *o1, PyObject *o2)
    返回o1 ^ o2
  • PyObject* PyNumber_Or(PyObject *o1, PyObject *o2)
    返回o1 | o2
  • PyObject* PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2)
    返回o1 += o2
  • PyObject* PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2)
    返回o1 -= o2
  • PyObject* PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2)
    返回o1 *= o2
  • PyObject* PyNumber_InPlaceFloorDivide(PyObject *o1, PyObject *o2)
    返回o1 //= o2
  • PyObject* PyNumber_InPlaceTrueDivide(PyObject *o1, PyObject *o2)

  • PyObject* PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2)
    返回o1 %= o2

  • PyObject* PyNumber_InPlacePower(PyObject *o1, PyObject *o2, PyObject *o3)
    返回o1 **=o2(when o3==Py_None)或o1=pow(o1, o2, o3)
  • PyObject* PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2)
    返回o1 <<= o2
  • PyObject* PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2)
    返回o1 >>= o2
  • PyObject* PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2)
    返回o1 &= o2
  • PyObject* PyNumber_InPlaceXor(PyObject *o1, PyObject *o2)
    返回o1 ^= o2
  • PyObject* PyNumber_InPlaceOr(PyObject *o1, PyObject *o2)
    返回o1 |= o2
  • PyObject* PyNumber_Long(PyObject *o)
    返回int(o)
  • PyObject* PyNumber_Float(PyObject *o)
    返回float(o)
  • PyObject* PyNumber_ToBase(PyObject *n, int base)
    转换进制,n为整数

3 序列

  • int PySequence_Check(PyObject *o)
    若对象o提供队列protocol则返回2,否则返回0。

  • Py_ssize_t PySequence_Size(PyObject *o)

  • Py_ssize_t PySequence_Length(PyObject *o)
    返回对象o中元素的数量,失败返回-1。len(o)

  • PyObject* PySequence_Concat(PyObject *o1, PyObject *o2)
    返回o1 + o2

  • PyObject* PySequence_Repeat(PyObject *o, Py_ssize_t count)
    返回o * count

  • PyObject* PySequence_InPlaceConcat(PyObject *o1, PyObject *o2)
    返回o1 += o2

  • PyObject* PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
    返回o *= count

  • PyObject* PySequence_GetItem(PyObject *o, Py_ssize_t i)

  • PyObject* PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
  • int PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v)
  • int PySequence_DelItem(PyObject *o, Py_ssize_t i)
  • int PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, PyObject *v)
  • int PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
  • Py_ssize_t PySequence_Count(PyObject *o, PyObject *value)
  • int PySequence_Contains(PyObject *o, PyObject *value)
  • Py_ssize_t PySequence_Index(PyObject *o, PyObject *value)

  • PyObject* PySequence_List(PyObject *o)
    返回一个list,内容来自序列对象o或迭代器o,失败返回NULL。

  • PyObject* PySequence_Tuple(PyObject *o)
    从序列对象o构造tuple返回,失败返回NULL。

4 字典

  • int PyMapping_Check(PyObject *o)
    若对象o提供字典protocol,则返回1,否则返回0。

  • Py_ssize_t PyMapping_Size(PyObject *o)

  • Py_ssize_t PyMapping_Length(PyObject *o)
    返回len(o)
  • int PyMapping_DelItemString(PyObject *o, const char *key)
  • int PyMapping_DelItem(PyObject *o, PyObject *key)
    返回del o[key]
  • int PyMapping_HasKeyString(PyObject *o, const char *key)
  • int PyMapping_HasKey(PyObject *o, PyObject *key)
    返回key in o
  • PyObject* PyMapping_Keys(PyObject *o)
    返回list(o.keys())
  • PyObject* PyMapping_Values(PyObject *o)
    返回list(o.values())
  • PyObject* PyMapping_Items(PyObject *o)
    返回list(o.items()),每一项都是一个元组(键,值)
  • PyObject* PyMapping_GetItemString(PyObject *o, const char *key)
    返回o[key]
  • int PyMapping_SetItemString(PyObject *o, const char *key, PyObject *v)
    o[key]=v,失败返回-1。

5 迭代器

  • int PyIter_Check(PyObject *o)
    若对象o支持迭代器操作则返回true
  • PyObject * PyIter_Next(PyObject *o)
    从迭代器o取下一个值并返回该值的新引用。若已没有数据可取或出错则返回NULL。
PyObject *iterator = PyObject_GetIter(obj);
PyObject *item;
if (iterator == NULL)
{
    // error
}
while (item = PyItem_Next(iterator))
{
    // do something with item
    ...
    // release reference when done
    Py_DECREF(item);
}
Py_DECREF(iterator);
if (PyErr_Occurred())
{
    // error
}
else
{
    // continue do something
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值