2016-07-07 241 views
2

我知道sympy的lambdify功能可以创建参数variables一个lambda和身体expression这样的:设置默认值

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符号对象,因为我从其他sympy表达式中提取它们。

回答

0

它使用字符串的事实是一个意外。 lambdify的工作方式是创建一个表达式的字符串形式,然后转义字符串"lambda %s: (%s)" % (', '.join(map(str, args)), expr)(它实际上比一般情况稍复杂一些,但这是基本思想)。所以如果参数是('x', 'y=0'),那最后插入为lambda x, y=0: ...

眼下lambdify没有一个选项,以使参数关键字参数,所以你最好的选择是:

  • 手动创建关键字参数使用字符串(你已经发现作品),或

  • 包裹lambdified功能在新的λ,像

    lambda x, y=0: lambdify((x, y), expr)(x, y) 
    

    要做到这一点在一般情况下,CA n个写入一些功能,创建你想要的任何逻辑关键字参数的包装,像

    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 
    
+0

我想我会只是转换为字符串,并使用该 –