2011-06-04 58 views
3

我有一個包含std::vector<Foo>的類,其中Foo是包含鍵,值,註釋等的類。請注意,有一個原因是爲什麼我使用的是矢量而不是一本字典。如何使用swig將下標操作符重載Python

我重載下標操作符在C++中,使得foos["Key Name"]將通過用於與密鑰匹配「項名稱」(其中foosstd::vector<Foo>)Foo對象的矢量進行搜索。

我使用SWIG來爲我的庫創建一個Python包裝器,我真的很希望這個下標操作器能夠擴展到Python。換句話說,我希望能夠使用foos["Key Name"]在Python中查找向量中的對象。

有關如何讓SWIG識別下標運算符並在Python中重載它的任何提示?我有些驚訝,我找不到在線人員的例子。我想大多數人只是使用std::map並讓SWIG將它轉換爲Python dict

回答

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++ []運算符。

+0

謝謝克里斯。這正是我所期待的。 – Joshua 2011-06-04 20:02:58

2

Python索引器是__getitem____setitem__方法。

請參閱here瞭解如何實施它們。

或者您可以在更現代的SWIG中使用%extendclause