Parsing a Python dictionary inside a Python extension

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • quadric@primenet.com

    Parsing a Python dictionary inside a Python extension

    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 * ModifyDictionar y( PyObject * self , PyObject * args )
    {
    int atab1 = 0 , atab2 = 0;
    PyObject * vdict = NULL;
    PyObject * item = NULL;
    PyObject * ndict = NULL;

    PyArg_ParseTupl e( args , "O" , & vdict );

    if ( (item = PyDict_GetItemS tring( vdict , "atab1")) != NULL
    ) PyArg_ParseTupl e( item , "i" , &atab1 );
    if ( (item = PyDict_GetItemS tring( vdict , "atab2")) != NULL
    ) PyArg_ParseTupl e( 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.


  • elbertlev@hotmail.com

    #2
    Re: Parsing a Python dictionary inside a Python extension

    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.

    Comment

    • tiissa

      #3
      Re: Parsing a Python dictionary inside a Python extension

      quadric@primene t.com wrote:[color=blue]
      > I tried something like this and it has not worked.[/color]

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

      [color=blue]
      > if ( (item = PyDict_GetItemS tring( vdict , "atab1")) != NULL )
      > PyArg_ParseTupl e( item , "i" , &atab1 );[/color]

      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.

      [color=blue]
      > // ndict = Py_BuildValue( ........create dictionary here ..........)
      >
      > return ndict ;
      > }[/color]

      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

      Comment

      Working...