`ast.literal_eval`等价于自定义类对象?

时间:2017-07-22 12:18:52

标签: python

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,但这与已经存在的变量有关。

1 个答案:

答案 0 :(得分:0)

如果您的数据是这样的 -

'["Foo(1)", "Foo(2)", "Foo(3)"]'

literal_eval会起作用。 因为它会认为Foo(1)和其他人是字符串并会识别它们。

'[Foo(1), Foo(2), Foo(3)]'

据我所知,这不能用作literal_eval中的参数。

来自docs

  

安全地评估表达式节点或包含Python文字或容器显示的字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,字节,数字,元组,列表,字符串,集合,布尔值和无。