我正在用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
个对象。在那里,我有一个在PyTypeObject
和Attr
注册的功能,这很好。
但我不知道如何实现删除(甚至不是单索引)。 mp_length
只有一个数据成员mp_subscript
。该文档提到PyMappingMethods
使用了它,(根据其docs)实现了mp_ass_subscript
。
在任何文档中都没有提及(official 2.7或Google)挂钩C / C ++函数以供PyObject_SetItem()
,o[key] = v
或PyObject_DelItem()
使用。如何在我的C ++实现的对象中实现这些?
我想提供项目删除的所有3种变体,但如果需要,我可以只使用普通PySequence_DelItem()
。我不想支持PySequence_DelSlice()
,但我相信如果唯一的方法是支持这两种结构,我可以在C ++方面处理它。
答案 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作为键传递。