【问题标题】:Eval function with parameters带参数的评估函数
【发布时间】:2016-07-11 20:47:26
【问题描述】:

我有三个功能:

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

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

myString = 'function_2'
eval(myString)

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

【问题讨论】:

  • 把它们做成变量x=[1,2,3]; y=1.2; z = 1.3; q = 5,然后作为'function_2(x,y,z,q)传递
  • 它们已经是这种格式,问题是如何将它们传递给您使用 eval 函数所说的'function_2(x,y,z,q) 形式。
  • 这不行吗? eval('function_2(x,y,z,q)')

标签: python eval


【解决方案1】:

谢谢蒂姆,

一切都必须是字符串格式,这样才行。

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

【讨论】:

    【解决方案2】:

    要从包含函数名称的变量调用函数,可以使用localsglobals 函数。基本上,您将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
    


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

    Eval is really dangerous

    SO: Why should exec and eval be avoided?

    SO: Is using eval a bad practice?

    【讨论】:

    • 请注意,像这样使用locals() 仅在命名函数本身是本地的(如您的示例中)时才有效。
    【解决方案3】:

    您可以像这样将参数传递给 eval 函数:

    def start(a, b, c):
        pass
    
    func = "start" 
    eval(func)(arg1, arg2, arg3)
    

    【讨论】:

    • 您好,完全没有解释的答案被认为是低质量的,尽管不被禁止。请添加至少一两句话,例如您的解决方案为何有效或您如何到达那里。一般来说,高质量的答案也更有可能获得奖励。
    猜你喜欢
    • 2015-12-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2011-02-12
    相关资源
    最近更新 更多