2010-06-22 8 views
7

पर स्विच करें मेरे पास पाइथन को सी ++ में इंटरफ़ेस करने के लिए कुछ कोड है जो ठीक काम करता है लेकिन हर बार जब मैं इसे देखता हूं तो मुझे लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए। सी ++ पक्ष पर एक 'संस्करण' प्रकार होता है जो मूल प्रकारों - int, वास्तविक, स्ट्रिंग, वेरिएंट के वेक्टर आदि की एक निश्चित सीमा से निपट सकता है। मेरे पास पाइथन एपीआई का उपयोग समकक्ष पायथन प्रकारों से कनवर्ट करने के लिए कुछ कोड है। ऐसा कुछ दिखता है:पायथन सीपीआई: PyObject प्रकार

variant makeVariant(PyObject* value) 
{ 
    if (PyString_Check(value)) { 
    return PyString_AsString(value); 
    } 
    else if (value == Py_None) { 
    return variant(); 
    } 
    else if (PyBool_Check(value)) { 
    return value == Py_True; 
    } 
    else if (PyInt_Check(value)) { 
    return PyInt_AsLong(value); 
    } 
    else if (PyFloat_Check(value)) { 
    return PyFloat_AsDouble(value); 
    } 
    // ... etc 

समस्या अगर जंजीर है तो समस्या है। ऐसा लगता है कि एक स्विच स्टेटमेंट, या एक टेबल या सृजन फ़ंक्शंस का मानचित्र जो एक प्रकार पहचानकर्ता द्वारा की जाती है। दूसरे शब्दों में मैं की तरह कुछ लिखने के लिए सक्षम होना चाहते हैं:

return createFunMap[typeID(value)](value); 

एपीआई डॉक्स यह स्पष्ट नहीं था की एक स्किम क्या सबसे अच्छा तरीका है सीधे 'typeID' यहां आने के लिए है के आधार पर। मैं देख रहा हूँ मैं कुछ इस तरह कर सकते हैं:

PyTypeObject* type = value->ob_type; 

जाहिरा तौर पर मुझे प्रकार की जानकारी के लिए जल्दी से हो जाता है लेकिन क्या स्पष्ट तरीका उपयोग करने के लिए है कि प्रकार के सीमित सेट मैं में दिलचस्पी से संबंधित है?

उत्तर

3

एक तरह से, मुझे लगता है कि आपने अपने प्रश्न का उत्तर दिया है।

कहीं, आपको डेटा के आधार पर कार्यक्षमता का चयन करना होगा। सी में ऐसा करने का तरीका फ़ंक्शन पॉइंटर्स का उपयोग करना है।

object_type-> फ़ंक्शन मैपर का मानचित्र बनाएं ... जहां प्रत्येक फ़ंक्शन में स्पष्ट रूप से परिभाषित इंटरफ़ेस होता है।

variant PyBoolToVariant(PyObject *value) { 
    return value == Py_True; 
} 

Map<PyTypeObject*,variant* (PyObject*)> function_map; 

function_map.add(PyBool, PyBoolToVariant); 

अब आपका मेकविरिएंट इस तरह दिख सकता है।

variant makeVariant(PyObject *value) { 
    return (*function_map.get(value->ob_type))(value); 
} 

कठिन भाग को मानचित्र वस्तु के लिए सिंटैक्स सही होने वाला है। साथ ही, मुझे लगता है कि एक नक्शा वस्तु है जिसका आप उपयोग कर सकते हैं कि टाइप पैरामीटर (<PyTypeObject*, variant*(PyObject*)) लेता है।

शायद मुझे दूसरे प्रकार के मानचित्र के लिए सिंटैक्स सही नहीं मिला है। यह एक फ़ंक्शन के लिए एक सूचक होना चाहिए जो एक पॉइंटर लेता है और एक सूचक को एक वेरिएंट देता है।

मुझे आशा है कि यह सहायक होगा।

+0

धन्यवाद। Function_map.add (PyBool, ... आपके उत्तर का हिस्सा मुझे एपीआई दस्तावेज़ में सही जगह पर देखने के लिए एक संकेत था। मुझे लगता है कि इसे PyBool के बजाय PyBool_Type होना चाहिए। मेरे प्रश्न का सार वास्तव में था PyTypeObject के * मान * क्या हैं जिन्हें मुझे अपनी मानचित्र कुंजी के रूप में उपयोग करने की आवश्यकता है और यह इसका उत्तर देता है। – Bob