wha*_*hat 0 python json eval list
有没有办法将列表作为函数参数传递给eval()或者我是否必须将其转换为字符串然后将其解析为函数中的列表?
我的简单示例如下:
eval("func1(\'" + fArgs + "\')")
Run Code Online (Sandbox Code Playgroud)
我只是不确定是否有更好的方法将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)
Run Code Online (Sandbox Code Playgroud)
我认为这可能是错的,但据我所知,这是对eval的安全使用,因为可以调用的唯一函数是safe_list字典中列出的函数.要运行的函数和该函数的参数是从JSON对象中提取的.参数将被构造为一个列表,将列表与","一起加入列表中,还是被解释为实际参数或只是一个参数?
如果你使用的是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']()
Run Code Online (Sandbox Code Playgroud)
这种方法比安全性更高,eval因为它可以防止"不安全"的python库函数被注入到JSON中.但是,您仍然需要谨慎,不能操作提供给您的函数的数据来导致问题.