如何在C [++]中实现__delitem__和__delslice__?

时间:2014-04-17 07:35:08

标签: python c++ python-2.7

我正在用C ++实现Python 2.7模块。我需要定义一个类(我们称之为Attr),它将支持这些操作:

a = Attr()

# some code ...

x = a[7]       # must have
x = a['foo']   # must have
del a[4]       # must have
del a[5:12]    # should have
del a[5:12:3]  # could have

对于getter,我向PyMappingMethods的{​​{1}}成员添加了tp_as_mapping个对象。在那里,我有一个在PyTypeObjectAttr注册的功能,这很好。

但我不知道如何实现删除(甚至不是单索引)。 mp_length只有一个数据成员mp_subscript。该文档提到PyMappingMethods使用了它,(根据其docs)实现了mp_ass_subscript

在任何文档中都没有提及(official 2.7或Google)挂钩C / C ++函数以供PyObject_SetItem()o[key] = vPyObject_DelItem()使用。如何在我的C ++实现的对象中实现这些?

我想提供项目删除的所有3种变体,但如果需要,我可以只使用普通PySequence_DelItem()。我不想支持PySequence_DelSlice(),但我相信如果唯一的方法是支持这两种结构,我可以在C ++方面处理它。

1 个答案:

答案 0 :(得分:2)

我查看代码,看起来PySequence_DelItem正在使用mp_ass_subscript第三个参数NULL

PyObject_DelItem(PyObject *o, PyObject *key) {
    ...
    m = o->ob_type->tp_as_mapping;
    if (m && m->mp_ass_subscript)
        return m->mp_ass_subscript(o, key, (PyObject*)NULL);
    ...

使用slice删除会将SliceObject作为键传递。

相关问题