有没有办法将列表作为函数参数传递给eval()或者我是否必须将其转换为字符串然后将其解析为函数中的列表?
我的简单示例如下:
eval("func1(\'" + fArgs + "\')")
我只是不确定是否有更好的方法将fArgs作为列表而不是字符串
注意: 该列表由JSON响应提供
编辑:好的,这是我的课程的更多内容,以便更好地了解我如何使用evaldef 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对象中提取的。参数将被构造为一个列表,将列表与“,”一起加入列表中,还是被解释为实际参数或只是一个参数?
答案 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
参数?