Python преобразовать строковый объект в словарь - PullRequest
2 голосов
/ 14 июля 2010

Я работал над созданием сложной структуры данных, которая возвращала бы словарь.В настоящее время этот класс возвращает строковый объект вида

{
   cset : x,    
   b1   : y,
   b2   : z,    
   dep  : {    
              cset : x1,
              b1   : y1,    
              b2   : z1,    
              dep  : {    
                         cset : x2,     
                         b1   : y2,    
                         b2   : z2,    
                         dep  : <same as above.it  recurses few more levels>                         
                         ...  
                     }
        }
    }

Я хочу преобразовать весь этот строковый объект в словарь.Я прочитал одну из статей, чтобы использовать модуль pickle, но я не хочу сериализовать его в какой-то файл и использовать его.

Ссылка: http://bytes.com/topic/python/answers/36059-convert-dictionary-string-vice-versa

Я ищудля некоторых других более совершенных способов сделать это, если возможно.

Было бы замечательно знать любые такие способы.

Ответы [ 4 ]

8 голосов
/ 14 июля 2010

Не используйте 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}
1 голос
/ 14 июля 2010

Если вы достаточно осторожны, чтобы сохранить правильный код Python, вы можете использовать eval:

eval(yourlongstring)
0 голосов
/ 14 июля 2010

Это фактический формат данных? Есть ли у вас гибкость?

Это почти что JSON, стандартный формат данных, для которого в Python есть нативные библиотеки для чтения и записи (сериализации и десериализации). Однако, чтобы сделать его действительным JSON, ключи и значения должны быть заключены в кавычки:

"cset" : "x",
"b1"   : "y"

и т. Д.

0 голосов
/ 14 июля 2010

Вы, вероятно, хотите использовать Pickle:

http://docs.python.org/library/pickle.html#pickle.dumps

Он также может возвращать значение в виде строки вместо записи в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...