2012-12-05 10 views
6

Próbuję wykonać proste wywołanie przez odwołanie z Pythona do metody klasy C++.Przywoływanie wywołania metody python z argumentami odwołującymi się

Moje C++ kod wygląda następująco:

class Foo { 
protected: 
    int _internalVal; 
public: 
    Foo() : _internalVal(5){} 
    void getVal(int& val_io) {val_io = _internalVal;} 
    void getValDoesNothing(int val_io) {val_io = _internalVal;} 
} 

Moje doładowania kodem otoki który kompiluje grzywny:

BOOST_PYTHON_MODULE(libBar) { 
    boost::python::class_<Foo>("Foo") 
    .def("getVal", &Foo::getVal) 
    .def("getValDoesNothing", &Foo::getValDoesNothing); 
} 

Jednak kiedy dokonać następujących połączeń Pythonie

In [1]: import libBar 

In [2]: f = libBar.Foo() 

In [3]: f 
Out[3]: <libBar.Foo at 0x2b483c0> 

In [4]: val = int() 

In [5]: #next command is just to check function signature type 

In [6]: f.getValDoesNothing(val) 

In [7]: f.getVal(val) 
--------------------------------------------------------------------------- 
ArgumentError        Traceback (most recent call last) 
<ipython-input-5-531e4cea97c2> in <module>() 
----> 1 f.getVal(val) 

ArgumentError: Python argument types in 
    Foo.getVal(Foo, int) 
did not match C++ signature: 
    getVal(Foo {lvalue}, int {lvalue}) 

I pracuję z biblioteką, której nie kontroluję, więc zmiana getVal w celu zwrócenia wartości nie jest opcją.

Czy istnieje sposób na wykonanie ostatniego polecenia Pythona?

Nawet poprawkę, która nie zmienia zmiennej Python, ale nadal pozwala na wywołanie funkcji.

Odpowiedz

5

To, co próbujesz osiągnąć, nie jest poprawne w Pythonie. Liczby całkowite są niezmienne, więc nie można łatwo wywołać funkcji i mieć nadzieję, że zmienią jej zawartość.

Skoro pracujesz z biblioteką nie kontrolowania i zmiany GETVAL aby zwrócić wartość nie jest opcją, można utworzyć opakowanie tak:

int getVal(Foo &foo) { 
    int val_io; 
    foo.getVal(val_io); 
    return val_io; 
}; 

BOOST_PYTHON_MODULE(libBar) { 
    boost::python::def("getVal", getVal); 
    ... 
} 

a następnie użyć w ten sposób :

In [1]: import libBar 

In [2]: f = libBar.Foo() 

In [3]: f 
Out[3]: <libBar.Foo at 0x2b483c0 

In [3]: libBar.getVal(f) 
Out[3]: 5 
-1

W getValDoesNothing mijamy int. W getVal podajesz odwołanie do int.

Wierzę, że to jest źródło twojego problemu.

+0

Wiem, że przechodzę w referencji. Moje pytanie brzmi: jak to zrobić? –

Powiązane problemy