关于python:带参数的Eval函数

Eval function with parameters

我有三个功能:

1
2
3
4
5
6
def function_1(arg_1, arg_1, arg_1, arg_1):
    return sol_1
def function_2(arg_1, arg_2, arg_3, arg_4):
    return sol_2
def function_3(arg_1, arg_2, arg_3, arg_4):
    return sol_3

我想用一个字符串来称呼他们:

1
2
myString = 'function_2'
eval(myString)

但是我无法将参数传递给eval函数,以传递给自定义定义的function_2,因为它们不是同质的(np.arrayfloatfloatint)。


要从包含函数名称的变量中调用函数,可以使用localsglobals函数。基本上,您将locals()的输出视为本地声明的函数的字典,然后使用带逗号分隔的参数的括号正常调用返回值。

(有用的链接:SO:从字符串调用函数)

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
def function_1 (a1, a2):
    print 'func1: ', a1, a2
def function_2 (a1, a2):
    print 'func2: ', a1, a2

f1 = 'function_1'
f2 = 'function_2'

locals()[f1](2, 3)
# func1: 23

locals()[f2]('foo', 'blah')
# func2: fooblah

通常出于各种原因,您不想使用eval函数-其中之一就是安全性。例如:如果您传递给eval的部分内容来自用户输入,您是否可以确定它们没有给您危险值或做意外的事情?以下是一些谈论eval陷阱的链接:

评估真的很危险

SO:为什么应避免执行和评估?

SO:使用eval是一种不好的做法吗?


蒂姆,谢谢你

一切都必须以字符串格式进行,才能正常工作。

1
eval(myString + '(arg_1, arg_2, arg_3, arg_4)')