Parsing a Python dictionary inside a Python extension

Q

quadric

Hi,

I would like to pass a dictionary from my Python code to my Python
extension, extract
various values from the dictionary (from within the extension) , modify the
values for the
relevant keys and return the modified dictionary to Python.

Can someone point me to an example of what the C code might look like to do
this?


I tried something like this and it has not worked.


static PyObject * ModifyDictionary( PyObject * self , PyObject * args )
{
int atab1 = 0 , atab2 = 0;
PyObject * vdict = NULL;
PyObject * item = NULL;
PyObject * ndict = NULL;

PyArg_ParseTuple( args , "O" , & vdict );

if ( (item = PyDict_GetItemString( vdict , "atab1")) != NULL
) PyArg_ParseTuple( item , "i" , &atab1 );
if ( (item = PyDict_GetItemString( vdict , "atab2")) != NULL
) PyArg_ParseTuple( item , "i" , &atab2 );

// modify values here and rebuild the dictionary
// ndict = Py_BuildValue( ........create dictionary here ..........)

return ndict ;
}


Can someone tell me where I am going wrong or point me to an example?

Thanks for your help.
 
E

elbertlev

1. Why not to simplfy the problem. You can extract values from the
dictionari in python (this is fast). Put them in a list (fast). Pass
the list to the extension, handle it and return to python. etc.

2. Use Pyrex.
 
T

tiissa

I tried something like this and it has not worked.

Oh! What did you ask of it, what did you expect and what did you get?

if ( (item = PyDict_GetItemString( vdict , "atab1")) != NULL )
PyArg_ParseTuple( item , "i" , &atab1 );

This code expects a dictionary in which keys 'atab1' and 'atab2' are
singletons of integer. If that's what you want, I'd say it should work.

// ndict = Py_BuildValue( ........create dictionary here ..........)

return ndict ;
}

I personnally prefer 'return Py_BuildValue("");' than returning NULL
pointers (but I don't like to check the doc just to make sure NULL can
be interpreted as None).

In order to build a dictionary you could try:

....
return Py_BuildValue("{s:i,s:i}", "key1", atab1, "key2", atab2);
}

Or even "{s:(i),s:(i)}" to have singletons for values.


HTH
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,024
Latest member
ARDU_PROgrammER

Latest Threads

Top