有没有办法通过一个列表作为函数参数的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对象的该功能的参数。这些参数是被构造为一个列表,将与一同加入名单“”被解释为实际参数或只是一个单一的参数?

有帮助吗?

解决方案

如果您正在使用Python 2.6.x的,那么你就应该能够使用json模块(见PY文档的 19.2 )。如果不是,那么有蟒蛇JSON的使用通过Python包索引。这两个包的将用于解析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更安全,因为它可以防止被注入到JSON“不安全”蟒库函数。但是,你仍然需要谨慎的是提供给你的函数的数据不能被操纵造成的问题。

其他提示

指定参数以下方式作品:

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(),除非我误解的东西。

使用库来解析JSON输入可以比的eval一个较好的方法,是这样的:

import json
func1(json.loads(fArgs))

断言-ING该用户输入是正确的将是一个好主意,太

在别人有个好点的,你不应该使用eval。但是,如果你必须:

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

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

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

将只有一个参数与参数列表来调用它。也许你甚至想这样?

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

这将eval参数以及

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top