Ответ 1
>>> 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')}
Я делаю 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
... однако, это кажется мне очень уродливым. Есть ли более чистый способ сделать это? Я нашел старую дискуссию, что-то вроде этого, но мне интересно, нет ли быстрого и простого способа (например, библиотечная функция, которую я не знаю, или умный однострочный?).
>>> 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')}