现在,我已经做的寻找到sympy的选项自定义打印它看起来是很容易实现一点:
from sympy.printing.precedence import precedence
from sympy.printing.str import StrPrinter
class MyPrinter(StrPrinter):
def _print_Mod(self,expr):
own_level = precedence(expr)
args = (self.parenthesize(arg, own_level) for arg in expr.args)
return "{} % {}".format(*args)
parenthesize
取表达式和‘电平’,其中电平表示使优先级阈值的printer
的方法它实际广告周围参数d支架,所以只能将周围需要它们的操作括号:
from sympy.abc import x
printer = MyPrinter()
def test(expr):
print(printer.doprint(expr))
>>> test(x%3)
x % 3
>>> test((x+1)%3)
(x + 1) % 3
从我(极其有限)测试似乎表明这工作得很好,还可以看看下面的own_level
的说明。
如图所示documentation for overriding printing,你可以重写Basic.__str__
使用您的自定义打印机时,刚刚打印出来的表达式:
from sympy import Basic
Basic.__str__ = lambda expr, printer=MyPrinter(): printer.doprint(expr)
>>> print(x%3)
x % 3
一个侧面说明 - 原因Mod
不/不能这样做默认是因为它显然是从Function
继承:
>>> issubclass(sympy.Mod, sympy.Function)
True
这就是为什么它会显示在几乎每一个印刷是方法有一个函数调用,这也意味着模量具有相同的优先级功能:
>>> precedence(x%3)
70
>>> f = sympy.Function("f")
>>> precedence(f(x))
70
>>> print(f(x)%x) #so it thinks f(x) needs parens here
(f(x)) % x
,如果你找到一个合适的优先级,以用于own_level
请分享给我,因为我想更新我的答案。
摆脱括号,你可以检查参数[优先](http://docs.sympy.org/dev/modules/printing.html#sympy.printing.precedence.precedence),但我很安静惊讶这并不存在。 –
@ TadhgMcDonald-Jensen谢谢,但我仍然不知道这有什么帮助。也许你可以解释这有什么帮助。 –