ast.literal_eval
适用于评估python的内置类型:
In [42]: import ast
In [43]: ast.literal_eval('[1, 2, 3, "4", None, (5, 4, 3)]')
Out[43]: [1, 2, 3, '4', None, (5, 4, 3)]
自定义类对象失败:
In [44]: class Foo():
...: def __init__(self, val):
...: self.val = val
...:
In [45]: ast.literal_eval('[Foo(1), Foo(2), Foo(3)]')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-47-a3bd4f494d5d> in <module>()
----> 1 ast.literal_eval('[Foo(1), Foo(2), Foo(3)]')
但是,eval
效果很好:
In [46]: eval('[Foo(1), Foo(2), Foo(3)]')
Out[46]:
[<__main__.Foo at 0x107e13940>,
<__main__.Foo at 0x107e131d0>,
<__main__.Foo at 0x107e13160>]
如何将ast.literal_eval
的安全性与自定义对象的eval
功能结合起来?
我查看了this,但这与已经存在的变量有关。
答案 0 :(得分:0)
如果您的数据是这样的 -
'["Foo(1)", "Foo(2)", "Foo(3)"]'
literal_eval会起作用。 因为它会认为Foo(1)和其他人是字符串并会识别它们。
'[Foo(1), Foo(2), Foo(3)]'
据我所知,这不能用作literal_eval中的参数。
来自docs,
安全地评估表达式节点或包含Python文字或容器显示的字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,字节,数字,元组,列表,字符串,集合,布尔值和无。