Skip to main content
 首页 » 编程设计

python之在 sympy 中对符号表达式进行 lambdifying 时覆盖除法运算符

2025年05月04日12jirigala

我正在使用 Sympy 评估用户提供的符号表达式,但除法运算符的行为与任何其他数学运算符不同。在对具有重写运算符的对象求表达式时,我得到了预期的加法、减法和乘法结果,但不是除法。下面的代码说明了我的问题:

import sympy 
import numpy 
 
class NewMath(int): 
 
    def __add__(self, other): 
        print "Adding!" 
        return 
 
    def __sub__(self, other): 
        print "Subtracting!" 
        return 
 
    def __mul__(self, other): 
        print "Multiplying!" 
        return 
 
    def __div__(self, other): 
        print "Dividing!" 
        return 
 
three = NewMath(3) 
four = NewMath(4) 
 
three + four 
three - four 
three * four 
three / four 
 
# Override sympys default math 
func_map = {'+':NewMath.__add__, 
            '/':NewMath.__div__} 
 
lambda_args = [sympy.Symbol(arg) for arg in ['three', 'four']] 
 
print "Now sympy math:" 
lambda_addition = sympy.lambdify(lambda_args, sympy.Symbol('three') + sympy.Symbol('four'), modules=func_map) 
lambda_addition(three, four) 
 
lambda_subtraction = sympy.lambdify(lambda_args, sympy.Symbol('three')  - sympy.Symbol('four'), modules=func_map) 
lambda_subtraction(three, four) 
 
lambda_multiplucation = sympy.lambdify(lambda_args, sympy.Symbol('three')  * sympy.Symbol('four'), modules=func_map) 
lambda_multiplucation(three, four) 
 
lambda_division = sympy.lambdify(lambda_args, sympy.Symbol('three')  / sympy.Symbol('four'), modules=func_map) 
lambda_division(three, four) 

输出:

Adding! 
Subtracting! 
Multiplying! 
Dividing! 
Now sympy math: 
Adding! 
Subtracting! 
Multiplying! 
0.75 

我读过 Sympy Docs并看到 / 运算符是一个常见的陷阱,但文档似乎只是表明除法将默认为整数除法,我看不到任何表明 / 可以'被覆盖。您可以在我的示例中看到,我什至尝试使用 modules 参数将除法手动替换为我的自定义运算符,但无济于事。

我也看到了 division in sympy is really just a power of -1 and multiplication ,这是否意味着我的事业没有希望了?

我正在使用 python 2.7 和 sympy 1.0

请您参考如下方法:

你的事业当然不是完全没有希望的。这里有一些帮助您入门的选项。

首先,您似乎了解 \__div__\__truediv__ 和 \__floordiv__ 之间的区别,但如果您还不了解,here是他们的一些 python 2.7 文档。

在 python 2.7 中,覆盖 \__div__ 似乎应该做你想做的,除了你找到的关于 a/b 的 sympy 文档> 被评估为 a * b^(-1)。要解决这个问题,您还可以重写求幂运算符。

我尝试在我的 python3 环境中运行您的代码,更改所有 print 实例以便它们具有括号并将 div 的所有实例替换为 truediv。

这不是一个完整的答案,但我不能发表评论,所以这就是你得到的!