设置sympy lambdify参数的默认值

时间:2016-07-07 15:56:48

标签: python sympy

我知道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符号对象,因为我正在从其他同情表达中提取它们。

1 个答案:

答案 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