在python中从字典定义Lambda函数

在python中从字典定义Lambda函数,python,dictionary,lambda,sympy,Python,Dictionary,Lambda,Sympy,我试图定义一个具有多个属性的lambda函数,这些属性是sympy符号,在字典中如下所示 my_dict = {'sym1':sym1 , 'sym2':sym2 , ......} 我需要定义一个lambda函数来执行eval(),如下所示: fn = lambda expr , **my_dict : eval(expr) 因此,当我用字典用数值eval调用它时,可以正确地替换它们,如下所示: subs_dict={'sym1':1 , 'sym2':5 , ......) expr =

我试图定义一个具有多个属性的lambda函数,这些属性是
sympy
符号,在字典中如下所示

my_dict = {'sym1':sym1 , 'sym2':sym2 , ......}
我需要定义一个lambda函数来执行
eval()
,如下所示:

fn = lambda expr , **my_dict : eval(expr)
因此,当我用字典用数值
eval
调用它时,可以正确地替换它们,如下所示:

subs_dict={'sym1':1 , 'sym2':5 , ......)
expr = #some text eqn of the syms
x = fn(expr,**subs_dict)
print(x)

然而,当我这样做时,
x
作为符号的函数打印出来。。。为什么?我该怎么办?

eval
已经做了您想要的:

>>> eval("3*x**2 + 4*y", None, dict(x=0, y=-10000000))
-40000000
如果您的项目确实需要在lambda中包装
eval

>>> fn = lambda expr, **kwargs : eval(expr, None, kwargs)
>>> fn("3*x+4*y",x=1,y=2)
11
如果您使用的是Symphy,
lambdify
是一个更健壮的替代方案,它具有多个后端:

>>> import sympy as sp
>>> x, y = sp.symbols('x y')
>>> f = sp.lambdify((x, y), 3*x+4*y, modules='numpy')
>>> import numpy as np
>>> f(np.random.randn(10), np.random.randn(10))
array([ 3.86723102,  0.85028042, -1.74461009, -4.02824375, -0.59191871,
       -0.52022366,  5.43335779, -2.09120517, -7.16387162, -0.22421031])

为什么需要是
lambda
而不是
def
?为什么你要试着做你自己的替换,然后做Python
eval
,而不是让sympy替你替换和评估?这需要我解释很多…但这是一个大项目的一部分,需要像这样做sympy的子项目,比这个要慢得多,您需要解析表达式,遍历解析树进行替换,然后将其转换回字符串以传递给
eval
。您可能可以使用stdlib中的
ast
模块来完成大部分繁重的工作,但它仍然不是一件小事。所以,去读一下ast,开始写一些东西,当你陷入困境时,再回到这里。它比因为你还没有写而不能工作的东西慢得多?