Python "безопасный" eval (строка в bool / int / float / None / string) - PullRequest
12 голосов
/ 08 декабря 2010

Я делаю веб-приложение, которое выполняет некоторую обработку данных, поэтому я часто разбираю строки (из 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

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

1 Ответ

29 голосов
/ 08 декабря 2010

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