如何用SWIG在Python中重载下标运算符
我有一个类,里面有一个 std::vector<Foo>
,其中的 Foo
是一个包含键、值、注释等的类。需要注意的是,我之所以使用向量而不是字典是有原因的。
我在C++中重载了下标操作符,这样 foos["Key Name"]
就可以在向量中查找一个键为 "Key Name" 的 Foo 对象(这里的 foos
是一个 std::vector<Foo>
)。
我使用 SWIG 来为我的库创建一个Python的包装器,我真的希望这个下标操作符也能在Python中使用。换句话说,我想在Python中也能用 foos["Key Name"]
来查找向量中的对象。
有没有什么建议可以让SWIG识别这个下标操作符并在Python中重载它?我有点惊讶网上找不到人做这个的例子。我想大多数人只是使用 std::map
,然后让SWIG把它转换成Python的 dict
。
2 个回答
5
在普通的Python中,如果你想要重载下标操作符(也就是用方括号访问元素),你需要创建两个类方法:__getitem__
和__setitem__
。举个简单的例子:
class MyClass(object):
def __init__(self):
self.storage = {}
def __getitem__(self, key):
return self.storage[key]
def __setitem__(self, key, value):
self.storage[key] = value
如果你想在C++中处理这个问题,我的最佳猜测(不过我并没有验证过)是,你也需要在C++中创建__getitem__
和__setitem__
。你可以直接在C++代码中实现,或者使用SWIG中的%extend
指令来调用你的C++的[]
操作符。