带参数的eval函数

fiz*_*ris 3 python eval

我有三个功能:

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
Run Code Online (Sandbox Code Playgroud)

我想用字符串调用它们:

myString = 'function_2'
eval(myString)
Run Code Online (Sandbox Code Playgroud)

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

fiz*_*ris 7

谢谢蒂姆,

一切都必须是字符串格式,这行得通。

eval(myString + '(arg_1, arg_2, arg_3, arg_4)')
Run Code Online (Sandbox Code Playgroud)


xgo*_*ord 6

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

(有用的链接:SO: Calling a function from a string

例子:

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
Run Code Online (Sandbox Code Playgroud)


eval由于各种原因,您通常不想使用该功能——其中之一是安全性。例如:如果您传递给的部分内容eval来自用户输入,您能确定它们没有给您危险的值或做意想不到的事情吗?以下是一些讨论以下陷阱的链接eval

eval真的很危险

SO:为什么要避免使用 exec 和 eval?

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