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

Estoy creando una aplicación web que procesa algunos datos, por lo que a menudo me encuentro analizando cadenas (de una URL o un archivo de texto) en valores de Python.

Utilizo una función que es “una especie de” una versión más segura de eval (excepto que si no puede leer la cadena, sigue siendo una cadena):

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 

… sin embargo, esto me parece muy feo. ¿Hay una forma más limpia de hacer esto? Encontré una vieja discusión sobre algo como esto, pero me pregunto si no hay una forma rápida y simple (como una función de biblioteca que no conozco, o una inteligente de una línea).

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')}