python object type überprüfen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
monternet
User
Beiträge: 15
Registriert: Donnerstag 15. September 2011, 09:14

Hallo,

ich habe ein python object durch Aufruf der Funktion PyRun_String() bekommen. Wie kann ich bzgl. des Types des Objekts überprüfen und dann die entspechende Funktion aufrufen, um die Info vom Objekt rauszubekommen? Hier habe ich folgenden Befehl verwendet:

Code: Alles auswählen

objecttype = PyObject_Type(pResult);
Dann sollte ich weiter den Type von objecttype überprüfen mit mehrere "if" statments? Wenn es stimmen würde, dann wäre ist Funktion PyObject_Type(PyObject *o) unsinn, finde ich.

Hat jemand eine Idee, wie ich mit der Typeüberprüfen schnell schaffen kann?


Vielen Dank im Voraus!
deets

Laut Dokumentation ist die Funktion eh unsinn, weil man besser mit o->ob_type arbeitet.

Aber dein Problem verstehe ich noch nicht - wie ausser mit einer if-Abfrage (oder switch) moechtest du denn gerne auf deinen Typ reagieren? Wie waere es, wenn du uns erstmal erzaehlst, was du da machst, dann kann man da auch Vorschlaege zu machen.
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Suchst du `PyObject_IsInstance()`?
monternet
User
Beiträge: 15
Registriert: Donnerstag 15. September 2011, 09:14

deets hat geschrieben:Laut Dokumentation ist die Funktion eh unsinn, weil man besser mit o->ob_type arbeitet.

Aber dein Problem verstehe ich noch nicht - wie ausser mit einer if-Abfrage (oder switch) moechtest du denn gerne auf deinen Typ reagieren? Wie waere es, wenn du uns erstmal erzaehlst, was du da machst, dann kann man da auch Vorschlaege zu machen.


Hi deets,

was ich eigentlich will, ist das von der Funktion PyRun_String() zurückgeliefert PyObject pResult zu analysieren, bzw. sein Type zu festzustellen, und danach durch die entsprechende Python-C Type-Umwandlungsfunktion den Inhalt von pResult anzuzeigen.

Was ich bis jetzt gemacht habe, ist nur zu "vermuten". d.h, mit mehrere "Type-Check Funktion" mit if Überprüfungen, z.B, PyString_Check, PyInt_Check usw. testen, ob pResult ein String-Object, oder ein Integer-Object ist.

Was ich hierbei fragen möchte, gibt's irgendwelche Python-C Funktion, mit der man sofort das Type von pResult bekommen kann, ohne tausend Mals ausprobieren?
deets

Was ist denn bitte schoen "der Inhalt"? Die String-Repraesentation? Dafuer kannst du doch zB PyObject_Print verwenden.

Generell gibt es nichts, womit du um deine if-abfragen rumkommst. Klar, kannst stattdessen ein switch-case machen, aber das ist jetzt ja nicht fundamental anders. Du musst schon fuer alles, was du behandeln willst, explizit etwas ausprogrammieren.
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was ist denn dein übergeordnetes Ziel? Baust du eine Shell, wo beliebige Eingaben gemacht werden können und dabei eben alle möglichen Objekttypen als Ergebnis rauskommen können? Anscheinend geht dir ja im Grunde gar nicht um eine Typprüfung, sondern einfach nur um den Ergebniswert. Soll denn in Abhängigkeit vom Ergebnis noch irgendwas damit gemacht werden? Reicht dir am Ende vielleicht sogar ein stumpfes `PyObject_Str()` aus? Du musst schon ein paar mehr Hintergrundinfos geben, damit man dir sinnvoll helfen kann. Und zwar vor allem etwas dazu, *was* du willst und weniger *wie* du es bisher machst. Du hast ja bis jetzt eher die Teilschritte beschrieben, von denen du glaubst, dass sie nötig sind, um dein Ziel zu erreichen. Wir wissen aber noch nicht, was dieses Ziel überhaupt genau sein soll. ;)
monternet
User
Beiträge: 15
Registriert: Donnerstag 15. September 2011, 09:14

Hallo snafu, deets,

danke für die Idee!

Also, ich wollte eigentlich durch embedded Python Python Code aufrufen. Nun weiss ich, was die Python Funktionen zurückliefern, die ich aufrufen möchte. Dann brauche ich nicht zu raten, sondern einfach zu überprüfen, ob die Rückgabe den entsprechenden Typ hat.

Vorher wusste ich nicht, wie die Rückgabe aus Python seite aussieht. Deshalb musste ich immer erst festlegen, welchen Typ die Rückgabe PyObject hatte. Dann wurde mit der Konvertierungsfunktion der entsprechenden Rückgabewert angezeigt.
Antworten