Python中使用eval()调用函数时如何传入numpy数组参数?
问题描述
我有一个存储要调用函数名称的变量:function_name = "some_func"。使用eval()函数调用该函数时,传入int、list等类型参数能正常运行,但传入numpy数组(np.ndarray)时会报错。
问题原因是numpy数组被转换为字符串后不符合Python语法,具体示例代码如下:
import numpy as np def some_func(np_arr): print(np_arr) print(type(np_arr)) if __name__ == "__main__": function_name = "some_func" my_arr = [[1,1,1],[2,2,2],[3,3,3]] eval(f"{function_name}({my_arr})") my_np_arr = np.array(my_arr) print(type(my_np_arr)) # 该行代码无法运行 eval(f"{function_name}({my_np_arr})")
报错信息:
eval(f"{function_name}({my_np_arr})") File "<string>", line 1 some_func([[1 1 1] ^^^ SyntaxError: 语法错误。可能忘记添加逗号?
请问如何将变量my_np_arr(numpy数组)作为参数传入eval()函数中?
解决方案
方法1:直接通过变量名引用(推荐)
不要把numpy数组转成字符串拼接,而是直接在eval的字符串里使用变量名,让eval直接读取当前作用域中的变量,避免字符串转换的问题:
import numpy as np def some_func(np_arr): print(np_arr) print(type(np_arr)) if __name__ == "__main__": function_name = "some_func" my_arr = [[1,1,1],[2,2,2],[3,3,3]] my_np_arr = np.array(my_arr) # 直接使用变量名 eval(f"{function_name}(my_np_arr)")
此时eval执行的字符串为"some_func(my_np_arr)",会直接调用函数并传入已定义的my_np_arr变量,完全绕开数组转字符串的语法问题。
方法2:用repr()获取numpy数组的合法字符串表示
如果必须把数组内容拼接到字符串里,可以用repr()函数,它会返回numpy数组符合Python语法规则的字符串表示:
import numpy as np def some_func(np_arr): print(np_arr) print(type(np_arr)) if __name__ == "__main__": function_name = "some_func" my_arr = [[1,1,1],[2,2,2],[3,3,3]] my_np_arr = np.array(my_arr) # 使用repr()获取合法字符串 eval(f"{function_name}({repr(my_np_arr)})")
repr(my_np_arr)会返回类似array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])的字符串,符合Python语法,eval可以正确解析。
方法3:避免使用eval()(更安全)
eval()存在安全风险,如果function_name或参数来自不可信输入,容易引发代码注入问题。推荐直接通过globals()或locals()获取函数对象调用:
import numpy as np def some_func(np_arr): print(np_arr) print(type(np_arr)) if __name__ == "__main__": function_name = "some_func" my_arr = [[1,1,1],[2,2,2],[3,3,3]] my_np_arr = np.array(my_arr) # 直接获取函数对象调用 func = globals()[function_name] func(my_np_arr)
这种方式无需使用eval(),既安全又避免了字符串拼接的问题,是更优的实现方式。
内容的提问来源于stack exchange,提问作者Sangam Khanal
相关产品推荐
相关产品推荐

