Это будет работать с вашим примером:
import ast
def elem_splitter(s):
return s.split(':',1)
s = '{a:1,b:2}'
s_no_braces = s.strip()[1:-1] #s.translate(None,'{}') is more elegant, but can fail if you can have strings with '{' or '}' enclosed.
elements = (elem_splitter(ss) for ss in s_no_braces.split(','))
d = dict((k,ast.literal_eval(v)) for k,v in elements)
Обратите внимание, что это произойдет, если у вас есть строка, отформатированная как:
'{s:"foo,bar",ss:2}' #comma in string is a problem for this algorithm
или:
'{s,ss:1,v:2}'
но он будет передавать строку как:
'{s ss:1,v:2}' #{"s ss":1, "v":2}
Вы также можете немного изменить elem_splitter
, в зависимости от ваших потребностей:
def elem_splitter(s):
k,v = s.split(':',1)
return k.strip(),v # maybe `v.strip() also?`
* Кто-то еще может приготовить лучший пример, используя больше модуля ast
, но я не очень хорошо знаю его внутренности, поэтому я сомневаюсь, что у меня будет время, чтобы ответить на этот вопрос.