1. ホーム
  2. python

[解決済み] String表現のDictionaryをDictionaryに変換する?

2022-03-17 14:42:23

質問

を変換するにはどうすればよいですか? str の表現が dict を、次のような文字列に変換します。 dict ?

s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"

を使用しない方が良いと思います。 eval . 他に何か使えるものはありますか?

この主な理由は、私の同僚が書いたクラスの1つが、すべての入力を文字列に変換するためです。私はこの問題に対処するために、彼のクラスを修正する気分ではありません。

どうすればいいですか?

を使用すると、内蔵の ast.literal_eval :

>>> import ast
>>> ast.literal_eval("{'muffin' : 'lolz', 'foo' : 'kitty'}")
{'muffin': 'lolz', 'foo': 'kitty'}

を使用するよりも安全です。 eval . それ自身のドキュメントにあるように

>>>ヘルプ(ast.literal_eval)
モジュール ast の関数 literal_eval に関するヘルプです。

literal_eval(node_or_string)
    Pythonの式ノードまたは文字列を安全に評価します。
    の式で表されます。 提供される文字列またはノードは、以下のものだけから構成されることができます。
    Python リテラル構造:文字列、数値、タプル、リスト、ディクツ、ブーリアン。
    およびNone。

例えば

>>> eval("shutil.rmtree('mongo')")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
  File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 208, in rmtree
    onerror(os.listdir, path, sys.exc_info())
  File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 206, in rmtree
    names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mongo'
>>> ast.literal_eval("shutil.rmtree('mongo')")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 68, in literal_eval
    return _convert(node_or_string)
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 67, in _convert
    raise ValueError('malformed string')
ValueError: malformed string