Python "safe" eval (string to bool/int/float/None/string)

parsing, python, type-conversion

Solution

`ast.literal_eval()`

>>> ast.literal_eval('{False: (1, 0x2), True: [3.14, 04, 0b101], None: ("6", u"7", r\'8\')}')
{False: (1, 2), True: [3.1400000000000001, 4, 5], None: ('6', u'7', '8')}

Problem

I'm making a webapp that does some data processing, so I frequently find myself parsing strings (from an URL or a text file) into Python values. I use a function that is "kind of" a safer version of eval (except that if it can't read the string, it stays a string): ``` def str_to_value(string): for atom in (True, False, None): if str(atom) == string: return atom else: try: return int(string) except ValueError: try: return float(string) except ValueError: return string ``` ... however, this seems very ugly to me. Is there a cleaner way of doing this? I found an old discussion os something like this, but I'm wondering if there isn't a quick and simple way (like a library function I don't know of, or a clever one-liner?).

Original source

Related problems