【问题标题】:Python eval function and passing arguments?Python eval 函数和传递参数?
【发布时间】:2019-10-26 04:23:18
【问题描述】:

如何将变量传递给 eval 函数?

我已经尝试过在 SO 上发布的一些解决方案以及通读 Python 文档

我有这部分代码“v”,我想在我的另一部分代码中重用它。这是一个sn-p:

 v = lambda r5, cdate : somefunc(r4, cdate) + math.exp(-t_3m*r1 - t_6m*r2 - t_1y*r3 - t_2y*r4 - retfrac(d[4], d[5], cdate, eoffset = 730)*r5) + \
                                                      math.exp(-t_3m*r1 - t_6m*r2 - t_1y*r3 - t_2y*r4 - t_3y*r5)

然后我想为之类的东西做点什么:

w = "v(r5, cdate) + math.exp(-t_3m*r1 - t_6m*r2 - t_1y*r3 - t_2y*r4 - t_3y*r5)*(0"
# + some other expressions that I have to build up using a for loop since there is no closed form solution
func = lambda r6, cdate = i[30] : (five_year + (coupon_five_year/2)*(1-(ia_5y/.5))) - (coupon_five_year/2)*(eval(w)) - 100*math.exp(-t_3m*r1 - t_6m*r2 - t_1y*r3 - t_2y*r4 - t_3y*r5 - t_5y*r6)
                r6 = fsolve(func, xguess)[0]

当我尝试对此进行评估时,我收到一条错误消息:

NameError: name 'v' is not defined

一旦我从 w 的表达式中删除 v,我就会得到一个 t_3m 的 NameError,它只是贯穿所有变量。有人可以帮帮我吗?

【问题讨论】:

  • v是一个函数,为什么不能直接传参数给它?
  • 我已经尝试将它直接移动到函数语句中,但是我仍然在 w 上得到一个名称错误。我相信“d”上的索引越界错误,但我已经验证 d 有近 20 个元素。

标签: python python-3.x python-2.7 scipy eval


【解决方案1】:

eval 函数接受两个附加参数来为其提供全局变量和局部变量。

你只需要这样称呼它:eval(w,globals(),locals())

假设你调用 eval() 时 w 字符串中的变量引用都在作用域内。

【讨论】:

  • 所以我做了这个,它似乎有点工作。出于某种原因,它引发了我在字符串 w 中引用的数组的索引错误(被评估的字符串。它没有正确传递这个数组吗?我已经验证该数组有 20 个元素,而我调用元素 5 和6.
  • 有时很难用 eval() 调试问题。您可能会尝试将您的 eval() 调用临时替换为字符串中包含的实际代码,以便 Python 有望返回更有意义的错误。您也可以在调用之前尝试打印 locals()["variableName"] 以查看该函数实际使用的内容。
  • 啊,好吧,我使用的列表称为 d,并且在另一个名为 d 的程序中还有另一个列表,它只有 4 个元素 - 因此,我相信会导致问题,本地的列表 d范围是正确的,而全局范围中的列表 d 是错误的。无论如何我可以做, eval(w, None, locals()) 并让它工作?
  • 是的,它会起作用,但是你的公式可能无法使用你的一些全局函数,你可以做的是创建一个合并的本地字典来传递而不是 locals()。例如mergedDict = {**globals(),**locals()},然后拨打eval(w,None,mergedDict)。这将使您可以控制变量名的优先级(尽管我很惊讶 eval() 在有可用的本地 'd' 时会使用全局 'd')。
  • 最终通过将 d 声明为全局变量来启动该部分。另一个快速的问题:我收到错误消息,上面写着python TypeError: <lambda>() takes 1 positional argument but 2 were given 我正在发送 func r6,然后 cdate = i[30] 用于评估 w,v(r5, cdate) 所在的位置。你知道这个错误的根源吗?
猜你喜欢
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多