Подтвердить что ты не робот

Python "safe" eval (строка для bool/int/float/None/string)

Я делаю webapp, который выполняет некоторую обработку данных, поэтому часто обнаруживаю, что я разбираю строки (из URL-адреса или текстового файла) в значения Python.

Я использую функцию "своего рода" более безопасную версию eval (за исключением того, что если она не может прочитать строку, она остается в строке):

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

... однако, это кажется мне очень уродливым. Есть ли более чистый способ сделать это? Я нашел старую дискуссию, что-то вроде этого, но мне интересно, нет ли быстрого и простого способа (например, библиотечная функция, которую я не знаю, или умный однострочный?).

4b9b3361

Ответ 1

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