我正在使用 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。
这不是一个完整的答案,但我不能发表评论,所以这就是你得到的!
