views:

66

answers:

4

Hi

I have been working to build a complex data structure which would return a dictionary. Currently that class return string object of the form

{ 

   cset : x,

   b1   : y,

   b2   : z,

   dep  : {

              cset : x1,

              b1   : y1,

              b2   : z1,

              dep  : {

                         cset : x2,

                         b1   : y2,

                         b2   : z2,

                         dep  : <same as above.it  recurses few more levels>

                         .......

                     }
        }

}

I want to convert this whole string object into dictionary. I read on one of the articles to use pickle module, but I don't want to serialize it into some file and use it.

Ref : http://bytes.com/topic/python/answers/36059-convert-dictionary-string-vice-versa

I am looking for some other neater ways of doing it, if possible.

Would be great to know any such ways

Thank you

FIXED!!!!!

in each class I added a attributed called __ json __(self) and returned dictionary, so final object came out to be dictionary. for example :

views.py

if (object.__ json __(self)):

return object.__json__(self)

and in your object class

class object:

def __json__(self):
    return {

             cset : x.__json__(self),
             b1   : y.__json__(self),
             dep  : object.__json__(self)
     }


class x:

def __json_(self):

    return {
             a : m,
             b : n,
    }

class y:

def __json__(self):
    return {
             k : 1,
             b : 2,
    } 

Hope this helps!

Thank you

+2  A: 

If you are careful enough to keep the code valid python, you could use eval:

eval(yourlongstring)
orangeoctopus
A: 

You probably do want to use Pickle:

http://docs.python.org/library/pickle.html#pickle.dumps

It can also return the value as a string, rather than writing to a file.

eruciform
always better to use standard libraries if possible!
eruciform
A: 

Is that the actual data format? Do you have any flexibility?

It's very nearly JSON, which is a standard data format for which Python has native libraries for reading and writing (serialising and deserialising). However, to make it valid JSON both the keys and values would need to be surrounded by quotes:

"cset" : "x",
"b1"   : "y"

and so on.

Daniel Roseman
A: 

Don't use eval. If you are sure that the string will always contain a valid Python dict, use ast.literal_eval. This works pretty much like eval, but it only evaluates if the expression is a valid dict,list, etc. and throws an exceptions if it isn't. This is way safer than trying to evaluate strings that may contain arbitrary code at runtime.

From the docs:

Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.

This can be used for safely evaluating strings containing Python expressions from untrusted sources without the need to parse the values oneself.

Code Example:

>>> import ast
>>> ast.literal_eval("1+1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/ast.py", line 68, in literal_eval
    return _convert(node_or_string)
  File "/usr/lib/python2.6/ast.py", line 67, in _convert
    raise ValueError('malformed string')
ValueError: malformed string
>>> ast.literal_eval("\"1+1\"")
'1+1'
>>> ast.literal_eval("{'a': 2, 'b': 3, 3:'xyz'}")
{'a': 2, 3: 'xyz', 'b': 3}
MAK