我知道sympy的lambdify
函数可以创建一个带有参数variables
和body expression
的lambda,如下所示:
lambdify(variables, expression)
所以
lambdify((Symbol('x'), Symbol('y')) , 'x**2 + y')
产生
lambda x, y: x**2 + y
但是如何为某些变量提供默认值?得到类似
的东西lambda x, y=0: x**2 + y
我知道我可以使用像lambdify(('x', 'y=0') , 'x**2 + y')
之类的字符串来完成此操作,但是我需要使用sympy符号对象,因为我正在从其他同情表达中提取它们。
答案 0 :(得分:0)
它与字符串一起工作的事实是一个意外。 lambdify的工作方式是创建表达式的字符串形式,然后逐出字符串"lambda %s: (%s)" % (', '.join(map(str, args)), expr)
(它实际上比一般情况稍微复杂,但这是基本的想法)。因此,如果args为('x', 'y=0')
,则最终会以lambda x, y=0: ...
插入。
现在lambdify
没有制作参数关键字参数的选项,因此您最好的选择是:
使用字符串手动创建关键字参数(您已发现的工作原理)或
将lambdified函数包装在一个新的lambda中,如
lambda x, y=0: lambdify((x, y), expr)(x, y)
要在一般情况下执行此操作,您可以编写一些函数,使用您想要的任何逻辑创建关键字参数包装器,例如
def create_wrapped(args, expr):
func = lambdify(args, expr)
@functools.wraps(func)
def wrapped(*_args, **kwargs):
# Write the logic here to parse _args and kwargs for the arguments as you want them
return func(*actual_args)
return wrapped