3

我有一个类,其中包含一个std::vector<Foo>包含Foo键、值、注释等的类。请注意,我使用向量而不是字典是有原因的。

我在 C++ 中重载了下标运算符,这样foos["Key Name"]它将在向量中搜索具有键匹配“键名”(其中foosa std::vector<Foo>)的 Foo 对象。

我使用SWIG为我的库创建 Python 包装器,我真的希望这个下标运算符扩展到 Python。换句话说,我希望能够foos["Key Name"]在 Python 中使用 for 在向量中查找对象。

关于如何让 SWIG 识别下标运算符并在 Python 中重载它的任何提示?我有点惊讶我在网上找不到这样做的人的例子。我猜大多数人只是使用 astd::map并让 SWIG 将其转换为 Python dict

4

2 回答 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__and 。__setitem__您可以直接在 C++ 代码中执行此操作,也可以使用%extendSWIG 中的指令调用 C++[]运算符。

于 2011-06-04T19:45:14.037 回答
2

Python 索引器是__getitem____setitem__方法。

请参阅此处了解如何实现它们。

或者您可以在更现代的 SWIG 中使用%extend 子句。

于 2011-06-04T19:44:21.657 回答