Checking the type of a PyObject

wim delvaux wim.delvaux at adaptiveplanet.com
Sun Aug 12 19:01:35 CEST 2001


your suggestion was what I needed,   The stirng and int were merely
examples.  In fact the object
that would be passed as first argument would be a real object.  So only
your suggestion would work.

Question remains.  How can I get access to the PyString_Type variable
(buffer) declared in the extension module (if I remember)
for those abstract objects, if you do not know the name of the buffer
but only the name of the type.

Example.  Suppose you have extended with 2 types TypeA and TypeB (both
non-builtin of course)

How do you get access to the TypeA_Type and TypeB_Type type descriptors.

i.e. Is there a call like

    PyGetType( TypeA)

With which one could write

        PyObject theType = PyObject_Type(FirstArg);

         if( theType == Py_GetType( TypeA ) ) {
           /* now you know FirstArg is of typeA
         } ....

        Py_DECREF(theType);    /* when done with it */

Or perhaps

    if ( PyObject_IsOfType( FirstArg, TypeA) ) ) {

    }

Thanx again



Alex Martelli wrote:

> "Rainer Deyke" <root at rainerdeyke.com> wrote in message
> news:Hdod7.27408$c8.8315711 at news1.denver1.co.home.com...
>     ...
> > One approach would be the obvious:
> >
> > Mod_Function( PyObject *self, PyObject *args )  {
> >   char * String;
> >   long IVal;
> >   if (PyArg_ParseTuple( args, "s", &String )) {
> >     /* do something with String */
> >   } else if (PyArg_ParseTuple( args, "i", &IVal)) {
> >     /* do something with IVal */
>
> One caveat: I think you need to reset the error-situation here,
> as the first (failing) PyArg_ParseTuple has set the exception
> and I don't think this second one resets it (I could be wrong --
> no direct experience of this idiom, as I strive to avoid
> typechecks whenever I can...).
>
> Another issue is that "i" also accepts and silently truncates
> floats, which may or may not be the right thing to do (it's
> sure quite different from checking the type of the object
> for equality to integer-type:-).
>
> >   } else {
> >     return NULL;
>
> And here I think the error message would only mention
> needing a string argument, so you probably want to
> substitute for it one mentioning both string and int.
>
> >   }
> > }
>
> Alex




More information about the Python-list mailing list