题
有没有办法通过一个列表作为函数参数的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
参数以及
不隶属于 StackOverflow