You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:45:42