如何用SWIG在Python中重载下标运算符

3 投票
2 回答
2573 浏览
提问于 2025-04-16 18:57

我有一个类,里面有一个 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 个回答

2

在Python中,索引器是指两个特殊的方法,分别叫做 __getitem____setitem__

想了解如何实现这两个方法,可以查看 这里 的内容。

另外,你也可以在更现代的SWIG中使用 %extend 条款

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++的[]操作符。

撰写回答