2012-12-05 18 views
6

मैं पाइथन से सी ++ कक्षा विधि में संदर्भ द्वारा एक साधारण कॉल करने की कोशिश कर रहा हूं।संदर्भ तर्क के साथ बूथ पायथन विधि कॉल

मेरे सी ++ कोड लगता है:

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;} 
} 

मेरे बढ़ावा आवरण कोड है जो ठीक संकलित है:

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

लेकिन जब मैं निम्नलिखित अजगर कॉल कर:

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}) 

मैं मैं एक पुस्तकालय के साथ काम कर रहा हूं, मैं नियंत्रण नहीं करता हूं इसलिए मूल्य वापस करने के लिए getVal बदलना एक विकल्प नहीं है।

क्या अंतिम पायथन कमांड काम करने का कोई तरीका है?

मैं एक ऐसा फ़िक्स भी लेगा जो पाइथन वैरिएबल को नहीं बदलेगा लेकिन फिर भी फ़ंक्शन कॉल की अनुमति देता है।

उत्तर

5

जो आप प्राप्त करने का प्रयास कर रहे हैं वह पायथन में मान्य नहीं है। इंटीग्रर्स अपरिवर्तनीय हैं, इसलिए आप एक फ़ंक्शन को सरल नहीं कह सकते हैं और उम्मीद करते हैं कि यह इसकी सामग्री को बदलने जा रहा है।

आप और एक पुस्तकालय आप नियंत्रित नहीं करते के साथ काम करने getVal बदलते मान देने के लिए कर रहे हैं के बाद से, एक विकल्प नहीं है जब आप किसी ऐसे आवरण बना सकते हैं:

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

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

और उसके बाद इस तरह से उपयोग करें :

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

GetValDoes में आप कुछ भी नहीं कर रहे हैं। GetVal में आप एक int का संदर्भ पारित कर रहे हैं।

मेरा मानना ​​है कि यह आपकी समस्या का स्रोत है।

+0

मुझे पता है कि मैं एक संदर्भ में गुजर रहा हूं। मेरा सवाल यह है कि मैं यह कैसे कर सकता हूं? –