将列表传递给eval()

时间:2009-12-01 14:19:10

标签: python json list eval

有没有办法将列表作为函数参数传递给eval()或者我是否必须将其转换为字符串然后将其解析为函数中的列表?

我的简单示例如下:

 eval("func1(\'" + fArgs + "\')")

我只是不确定是否有更好的方法将fArgs作为列表而不是字符串

注意: 该列表由JSON响应提供

编辑:好的,这是我的课程的更多内容,以便更好地了解我如何使用eval

def test(arg):
     print arg

#Add all allowed functions to this list to be mapped to a dictionary     
safe_list = ['test']
safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])

class Validate:
     def __init__(self, Value, fName, fArgs):
     eval(fName + "(\'" + fArgs + "\')", {"__builtins__":None},safe_dict)

我认为这可能是错的,但据我所知,这是对eval的安全使用,因为可以调用的唯一函数是safe_list字典中列出的函数。要运行的函数和该函数的参数是从JSON对象中提取的。参数将被构造为一个列表,将列表与“,”一起加入列表中,还是被解释为实际参数或只是一个参数?

4 个答案:

答案 0 :(得分:7)

如果您使用的是Python 2.6.x,那么您应该可以使用json模块(请参阅py doc 19.2)。如果没有,那么通过python包索引可以获得python-json。这两个软件包都将提供一个阅读器,用于将JSON数据解析为适当的Python数据类型。

对于调用由消息确定的函数的第二个问题,您可以执行以下操作:

def foo():
    print 'I am foo!'
def bar():
    pass
def baz():
    pass

funcs = {'func_a':foo, 'func_b':bar, 'func_c':baz}

funcs['func_a']()

这种方法比eval更安全,因为它可以防止'不安全'的python库函数被注入JSON。但是,您仍然需要谨慎,不能操作提供给您的函数的数据来导致问题。

答案 1 :(得分:2)

指定参数the following way有效:

root@parrot$ more test.py
def func1(*args):
        for i in args:
                print i

l = [1,'a',9.1]
func1(*l)

root@parrot$ python test.py
1
a
9.1

所以,除非我误解了某些东西,否则不需要eval()。

答案 2 :(得分:1)

使用库来解析JSON输入可能是比eval更好的方法,例如:

import json
func1(json.loads(fArgs))

断言用户输入是正确的也是个好主意。

答案 3 :(得分:0)

其他人有一个好处,你不应该使用eval。但是,如果你必须:

eval("func1(%s)" % ", ".join(fArgs))

将使用列表中的所有参数调用该函数。这样:

eval("func1([%s])" % ", ".join(fArgs))

将仅使用一个参数中的参数列表来调用它。也许你甚至想要这个?

eval("func1([%s])" % ", ".join(map(eval, fArgs)))

也会eval参数?