Вы можете попробовать проанализировать строку самостоятельно:
def parse_input(x):
result = dict()
x = x.replace(":", "")
for pair in x[1:-1].split(","):
key,value = tuple(pair.split(" = "))
result[key.strip()] = int(value.strip())
return result
В качестве альтернативы вы можете преобразовать строку в допустимый json, а затем загрузить ее:
obj = json.loads(data.replace("{", '{"').replace(":", "").replace(" = ", '":').replace(", ", ', "'))
Если вам нужно злое решение, которое «работает», то вам сюда:
Однако используйте это только в том случае, если ввод на 100% доверен (поскольку он использует eval). Кроме того, это будет работать только для входных данных, точно соответствующих вашему примеру.
obj = eval(data.replace("{", "{'").replace(":", "").replace(" = ", "':").replace(", ", ", '"))
(Я знаю, что вы уже обсуждали доверенные входные данные в своем ответе, но зачем использовать eval, когда существует так много более безопасных (и таких же простых) вариантов? Напишите регулярное выражение. Или прочитайте строку посимвольно и напишите свою собственную логику для анализа целые числа (или другие данные). Или, поскольку ваш ответ включает в себя: split() по пробелу или другому разделителю, а затем снова разделить на =, В каждом из этих случаев вы можете использовать более безопасный метод, такой как int, для оценки ввода , и все, что может произойти, это выдача ошибки, которую вам просто нужно поймать и обработать соответствующим образом.
eval
почти никогда не бывает правильным ответом. IMO часть после «если это не то, что вы ищете» должна быть в центре вашего ответа. Помимо части eval
, это хороший ответ. Добро пожаловать в Stack Overflow!
Вы правы, что eval не следует использовать для любого ненадежного ввода. Я изменил основной ответ на другой вариант. Тем не менее, я думаю, что eval и exec могут быть очень полезными инструментами для быстрых и хакерских решений, которые используются только один раз для надежных данных.
Спасибо за ответ, кстати, я сделал это - import json data = '{x=1, y=2}' y = json.loads(data.replace('{', '{"').replace('=', '":').replace(', ', ', "'))
Примечание. Не используйте eval для ненадежного ввода. Например, попробуйте eval('{\'x\':__import__(\'os\').listdir()}')