在Python中将字符串转换为字典

use*_*008 4 python

我有以下字符串:

str = "{application.root.category.id:2}"
Run Code Online (Sandbox Code Playgroud)

我想将上面的内容转换为 python 中的字典数据类型,如下所示:

dict = {application.root.category.id:2}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 eval() ,这是我得到的错误:

AttributeError:java包“application”没有属性“root”

我当前的 python 是 <2.3 ,我无法将 python 更新到 >2.3 。

有什么解决办法吗?

Gar*_*han 5

Python 字典的键不一定是字符串;因此,当您编写时,如果它是一个字符串,则{a: b}需要用引号引起来。a{1:2}例如,将整数1 映射到整数 2。)

所以你不能只传递你必须传递的东西eval。你需要自己解析它。(或者,如果它碰巧更容易,请更改生成它的任何内容以在键两边加上引号。)

具体如何解析它取决于您的词典实际上是什么样子;例如,值本身可以是字典吗,或者它们总是数字,还是什么?这是一个简单但可能过于粗糙的方法:

contents = str[1:-1]        # strip off leading { and trailing }
items = contents.split(',') # each individual item looks like key:value
pairs = [item.split(':',1) for item in items] # ("key","value"), both strings
d = dict((k,eval(v)) for (k,v) in pairs) # evaluate values but not strings
Run Code Online (Sandbox Code Playgroud)

  • 出于安全原因,我宁愿使用 `int(v)` 或 `eval(v,{},{})` 而不是普通的 `eval(v)`。将 `eval("os.remove('/tmp/a')", {}, {})`(“名称 'os' 未定义”)与 `eval("os.remove('/tmp/a') 进行比较')")`(“没有这样的文件或目录:'/tmp/a'”)。 (3认同)
  • 是的。一般来说,使用“eval”(尤其是其简单的单参数形式)是一个非常非常糟糕的主意。我只是懒惰地这样做了,因为OP做了:-)。 (3认同)