Python 设置sympy lambdify参数的默认值

Python 设置sympy lambdify参数的默认值,python,sympy,Python,Sympy,我知道sympy函数可以创建一个lambda,其中包含参数变量和body表达式,如下所示: lambdify(variables, expression) 所以 产生 lambda x, y: x**2 + y 但是我如何给一些变量提供默认值呢?得到 lambda x, y=0: x**2 + y ? 我知道我可以用像lambdify(('x','y=0'),'x**2+y')这样的字符串来实现这一点。,但我需要使用Symphy符号对象,因为我是从其他Symphy表达式中提取它们的。它使用

我知道sympy函数可以创建一个lambda,其中包含参数
变量
和body
表达式
,如下所示:

lambdify(variables, expression)
所以

产生

lambda x, y: x**2 + y
但是我如何给一些变量提供默认值呢?得到

lambda x, y=0: x**2 + y
?


我知道我可以用像lambdify(('x','y=0'),'x**2+y')这样的字符串来实现这一点。,但我需要使用Symphy符号对象,因为我是从其他Symphy表达式中提取它们的。

它使用字符串是一个意外。lambdify的工作方式是创建表达式的字符串形式,然后求值字符串
“lambda%s:(%s)”%(','.join(map(str,args)),expr)
(实际上比一般情况稍微复杂一点,但这是基本思想)。因此,如果args是
('x','y=0')
,那么它最终被插入为
lambda x,y=0:…

现在,
lambdify
没有一个选项来生成parameters关键字参数,因此您最好的选项是:

  • 使用字符串手动创建关键字参数(您已经发现的是有效的),或者

  • 用新的lambda包装lambdified函数,如

      lambda x, y=0: lambdify((x, y), expr)(x, y)
    
    为了在一般情况下实现这一点,您可以编写一些函数,用您想要的任何逻辑创建关键字参数包装器,如

      from functools import wraps
    
      def create_wrapped(args, expr):
          func = lambdify(args, expr)
          @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
    

我想我将转换成字符串并使用它:import functools
  from functools import wraps

  def create_wrapped(args, expr):
      func = lambdify(args, expr)
      @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