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

How to implement __delitem__ and __delslice__ in C[++]?

本文关键字:实现 delitem delslice      更新时间:2023-10-16

我正在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,我向用于AttrPyTypeObjecttp_as_mapping成员添加了一个PyMappingMethods对象。在那里,我有一个在mp_lengthmp_subscript中注册的函数,它工作得很好。

但我不知道如何实现删除(甚至不知道单个索引)。PyMappingMethods只多了一个数据成员mp_ass_subscript。文档中提到,PyObject_SetItem()(根据其文档)实现了o[key] = v

在我能找到的任何文档(官方2.7或谷歌)中都没有提到挂接C/C++函数供PyObject_DelItem()PySequence_DelItem()PySequence_DelSlice()使用。如何在C++实现的对象中实现这些?

我想提供项目删除的所有3种变体,但如果需要,我可以只使用普通的del a[4]。我不想支持del a['foo'],但我相信,如果唯一的方法是支持这两种构造,我可以在C++方面处理它。

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

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);
    ...

使用切片进行删除将传递SliceObject作为关键字。