Как перегрузить оператор индекса с помощью Swig Python - PullRequest
3 голосов
/ 04 июня 2011

У меня есть класс, который содержит std::vector<Foo>, где Foo - это класс, содержащий ключ, значение, комментарий и т. Д. Обратите внимание, что есть причина, по которой я использую вектор, а не словарь.

Я перегрузил оператор индекса в C ++, так что foos["Key Name"] будет искать в векторе объект Foo с ключом, совпадающим с "Key Name" (где foos - std::vector<Foo>).

Я использую SWIG для создания оболочки Python для моей библиотеки, и мне бы очень хотелось, чтобы этот оператор индекса расширился до Python. Другими словами, я хочу иметь возможность использовать foos["Key Name"] для поиска объектов в векторе в Python.

Какие-нибудь советы о том, как заставить SWIG распознавать оператор индекса и перегрузить его в Python? Я немного удивлен, что я не смог найти примеры людей, делающих это онлайн. Я думаю, что большинство людей просто используют std::map и SWIG конвертирует его в Python dict.

Ответы [ 2 ]

5 голосов
/ 04 июня 2011

В прямом 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 ++ справлялся с этим, я бы предпочел (нет, я не проверял это), что вы создадите __getitem__ и __setitem__ в C ++. Вы можете сделать это непосредственно в своем коде C ++ или использовать директиву %extend в SWIG для вызова вашего оператора C ++ [].

2 голосов
/ 04 июня 2011

Python-индексаторы - это методы __getitem__ и __setitem__.

См. здесь о том, как их реализовать.

Или вы можете использовать %extend предложение в более современном SWIG.

...