2013-06-10 23 views
10

Ich habe Python in C++ eingebettet und würde gerne wissen, ob es einen Weg gibt, den Typ des boost :: python :: object zu finden, der nach dem Ausführen einer Funktion ein Ergebnis ist eines Python-Moduls. Ich habe meinen Code wie folgt aus:Finde den Typ des Boost-Python-Objekts

boost::python::object module_ = boost::python::import("..libName"); 
boost::python::object result_ = module_.attr("..functionName")(arg1, arg2,...); 
//suppose if the result is int, 
int a_ = boost::python::extract<int>(result_); 

Aus dem obigen Code-Schnipsel, was ich wissen möchte, ob es Art und Weise ist, bevor das Extrahieren sie die Art des Ergebnisses zu finden. Im obigen Code könnte das result_ ein beliebiger Typ wie list, tuple ... sein.

Antwort

3

Es gibt mehrere Möglichkeiten, den Typ eines Objekts zu ermitteln. Welche Sie verwenden, hängt davon ab, welches Format das Ergebnis haben soll. Sie könnten result_.attr("__class__") verwenden, um die Klasse als boost :: python :: object zu erhalten. Sie können auch die PyObject_IsInstance function verwenden, um zu überprüfen, ob es sich um den Typ handelt, von dem Sie denken, dass er es ist. Zuletzt könnten Sie den PyObject_Type function als PyObject * verwenden.

7

können Sie diese versuchen

std::vector<std::string> list_to_vector(boost::python::list& l) 
{ 
    for (int i = 0; i < len(n); ++i) 
    { 
     boost::python::extract<boost::python::object> objectExtractor(l[i]); 
     boost::python::object o=objectExtractor(); 
     std::string object_classname = boost::python::extract<std::string>(o.attr("__class__").attr("__name__")); 
     std::cout<<"this is an Object: "<<object_classname<<std::endl; 
    } 
    ................................................... 
    ................................................... 
} 

Es funktioniert für mich.

2

Da Sie scheinen zu überprüfen, um zu wollen, wenn es eine ganze Zahl ist, können Sie extract<T> x(o) verwenden:

boost::python::extract<int> n(o); 

if (n.check()) 
    // it's an integer, or at least convertible to one 
else 
    // not an integer 

Die documentation sagt:

Extrakt x (o); Konstruiert einen Extraktor, dessen check() - Memberfunktion verwendet werden kann, um zu fragen, ob eine Konvertierung verfügbar ist, ohne dass eine Ausnahme ausgelöst wird, die auslöst.

Das klingt, als ob ein Schwimmer umwandelbar erachtet werden können auf Integer, aber ich versuchte es, und es funktioniert nicht. Mit anderen Worten, ich würde nicht wirklich darauf vertrauen, dass es jedes Mal das Richtige tut!

Für eingebaute Typen, in diesem Fall eine ganze Zahl, ich denke, es ist sicher PyInt_Check zu verwenden, aber zumindest, wenn ich einige Codes hier getestet, es war nicht sofort verfügbar.

Mit anderen Worten, wenn Sie den Typ der Objekte, die nicht Python-Einbauten sind, ermitteln müssen, würde ich @Aereaux's suggestion von PyObject_IsInstance verwenden. (Aber ich persönlich hätte lieber eine saubere Boost Python-Codebasis als eine Mischung.)

+0

Wie Sie vorgeschlagen haben, ist es nicht zuverlässig. Extrahieren Sie wird glücklich ganze Zahlen annehmen – Sergei

+1

Ja. Seit diesem Post habe ich festgestellt, dass 'extract' versucht, automatisch zwischen kompatiblen Typen zu konvertieren. Um sicherzugehen, dass es sich um eine Ganzzahl handelt, verwenden Sie 'PyInt_Check'. – csl

Verwandte Themen