Eval “seguro” do Python (string para bool / int / float / None / string)

Como estou criando um aplicativo da web que processa alguns dados, frequentemente me vejo analisando cadeias de caracteres (de uma URL ou arquivo de texto) nos valores do Python.

Eu uso uma função que é "uma espécie de" uma versão mais segura do eval (exceto que, se ela não consegue ler a string, ela permanece uma 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

... no entanto, isso me parece muito feio. Existe uma maneira mais limpa de fazer isso? Eu encontrei umdiscussão antiga ou algo assim, mas estou me perguntando se não existe uma maneira rápida e simples (como uma função de biblioteca que eu não conheço, ou uma linha inteligente)?).

questionAnswers(1)

yourAnswerToTheQuestion