Не используйте eval
. Если вы уверены, что строка всегда будет содержать действительный Python dict
, используйте ast.literal_eval
. Это работает почти так же, как eval
, но оценивает только, является ли выражение допустимым dict
, list
и т. Д., И выдает исключения, если это не так. Это намного безопаснее, чем пытаться оценить строки, которые могут содержать произвольный код во время выполнения.
Из документов :
Безопасное вычисление узла выражения или
строка, содержащая Python
выражение. Строка или узел
при условии, может состоять только из
следующие литеральные структуры Python:
строки, числа, кортежи, списки,
dicts, booleans и None.
Это можно использовать для безопасной оценки
строки, содержащие выражения Python
из ненадежных источников без
нужно разобрать значения самостоятельно.
Пример кода:
>>> import ast
>>> ast.literal_eval("1+1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/ast.py", line 68, in literal_eval
return _convert(node_or_string)
File "/usr/lib/python2.6/ast.py", line 67, in _convert
raise ValueError('malformed string')
ValueError: malformed string
>>> ast.literal_eval("\"1+1\"")
'1+1'
>>> ast.literal_eval("{'a': 2, 'b': 3, 3:'xyz'}")
{'a': 2, 3: 'xyz', 'b': 3}