开发者

How to overload the subscript operator with swig Python

开发者 https://www.devze.com 2023-03-10 05:03 出处:网络
I have a class which 开发者_JAVA技巧contains a std::vector<Foo> where Foo is a class containing a key, value, comment, etc. Please note that there is a reason why I am using a vector and not a d

I have a class which 开发者_JAVA技巧contains a std::vector<Foo> where Foo is a class containing a key, value, comment, etc. Please note that there is a reason why I am using a vector and not a dictionary.

I have overloaded the subscript operator in C++ such that foos["Key Name"] will search through the vector for a Foo object with key matching "Key Name" (where foos is a std::vector<Foo>).

I use SWIG to create a Python wrapper for my library, and I would really like for this subscript operator to extend into Python. In other words, I want to be able to use the foos["Key Name"] for finding objects in the vector in Python.

Any tips on how to make SWIG recognize the subscript operator and overload it in Python? I am a little surprised that I couldn't find examples of people doing this online. I guess most people just use a std::map and have SWIG convert it to a Python dict.


In straight Python, if you want to overload the subscript operator, you would create a __getitem__ and __setitem__ class method. As a simple example:

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

So if you want to have C++ handle this, my very best guess (no, I haven't verified this) is that you would create a __getitem__ and __setitem__ in C++. You can either do this directly in your C++ code, or use the %extend directive within SWIG to call off to your C++ [] operator.


Python indexers are __getitem__ and __setitem__ methods.

See here on how to implement them.

Or you may use %extend clause in more modern SWIG.

0

精彩评论

暂无评论...
验证码 换一张
取 消