我正在使用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
答案 0 :(得分:-1)
你的事业当然不是完全没有希望的。以下是一些可以帮助您入门的选项。
首先,似乎您理解\__div__ \__truediv__
和\__floordiv__
之间的区别,但如果您还没有,here是一些python 2.7文档。
在python 2.7中,覆盖\__div__
似乎应该执行您想要的操作,但您发现的sympy
文档被a/b
评估为a * b^(-1)
除外。为了解决这个问题,您还可以覆盖取幂运算符。
我尝试在python3环境中运行您的代码,更改所有打印实例,以便它们有括号并用div
替换truediv
的所有实例。
这不是一个完整的答案,但我不能发表评论,所以这就是你得到的!