将字典的字符串表示形式转换为字典

新手上路,请多包涵

如何将 str 的表示形式 dict ,例如以下字符串,转换为 dict

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

我不想使用 eval 。我还能用什么?

这样做的主要原因是他编写的我的同事类之一,将所有输入转换为字符串。我没有心情去修改他的课程来处理这个问题。

原文由 UberJumper 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 257
2 个回答

您可以使用内置的 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 文字结构:字符串、数字、元组、列表、字典、布尔值、
    和无。

例如:

 >>> 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

原文由 Jacob Gabrielson 发布,翻译遵循 CC BY-SA 4.0 许可协议

https://docs.python.org/3.8/library/json.html

JSON 可以解决这个问题,尽管它的解码器需要在键和值周围加上双引号。如果你不介意更换黑客…

 import json
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
json_acceptable_string = s.replace("'", "\"")
d = json.loads(json_acceptable_string)
# d = {u'muffin': u'lolz', u'foo': u'kitty'}

请注意,如果您将单引号作为键或值的一部分,这将由于不正确的字符替换而失败。仅当您对 eval 解决方案有强烈的反感时,才推荐使用此解决方案。

关于 json 单引号的更多信息: jQuery.parseJSON throws “Invalid JSON” error due to escaped single quote in JSON

原文由 i0x539 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题