पर स्विच करें मेरे पास पाइथन को सी ++ में इंटरफ़ेस करने के लिए कुछ कोड है जो ठीक काम करता है लेकिन हर बार जब मैं इसे देखता हूं तो मुझे लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए। सी ++ पक्ष पर एक 'संस्करण' प्रकार होता है जो मूल प्रकारों - 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;
जाहिरा तौर पर मुझे प्रकार की जानकारी के लिए जल्दी से हो जाता है लेकिन क्या स्पष्ट तरीका उपयोग करने के लिए है कि प्रकार के सीमित सेट मैं में दिलचस्पी से संबंधित है?
धन्यवाद। Function_map.add (PyBool, ... आपके उत्तर का हिस्सा मुझे एपीआई दस्तावेज़ में सही जगह पर देखने के लिए एक संकेत था। मुझे लगता है कि इसे PyBool के बजाय PyBool_Type होना चाहिए। मेरे प्रश्न का सार वास्तव में था PyTypeObject के * मान * क्या हैं जिन्हें मुझे अपनी मानचित्र कुंजी के रूप में उपयोग करने की आवश्यकता है और यह इसका उत्तर देता है। – Bob