如何在C[+]中实现UuDelitem_Uu和_UuDelSlice_Uu?

2024-10-02 10:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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对象添加到用于Attrtp_as_mapping成员。在这里,我有一个注册在mp_lengthmp_subscript中的函数,这很好用。在

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

< >我没有发现任何文件(official 2.7或谷歌)都挂起了C/C++函数,供^ {< CD12>}、^ {< CD13>}或^ {CD14>}使用。如何在C++实现的对象中实现这些?在

我想提供项目删除的所有3个变体,但如果需要,我可以使用普通的del a[4]。我不想支持^ {CD16}},但是我相信如果C++的方法是支持两种结构的话,我就可以在C++方面处理。在


Tags: 模块对象函数定义foohavecode成员
1条回答
网友
1楼 · 发布于 2024-10-02 10:23:10

我查看代码,发现PySequence_DelItem正在使用第三个参数NULLmp_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);
    ...

用slice删除将把SliceObject作为键传递。在

相关问题 更多 >

    热门问题