2017-02-21 72 views
0

我想知道如何将Sympy的“Mod()”转换为Python的百分号(%)的默认语法。我无法找到任何“内置”功能(在Sympy软件包中)。我可以自己写一个,但我希望简化结果。在我创建的函数中,我意识到我不知道如何避免添加额外的括号。因为我想以最简单的形式出现,所以我需要使用Sympy的简化。然后,这将撤消“Mod()”到“%”的转换。因此,如果没有简单的方法将Sympy的Mod转换为Python的“%”,请告诉我Sympy有一种方法可以简化括号。我看了,而且我还没有找到。我至少想要一种方法来删除多余的括号,而无需将“%”转换回“Mod”。如何将Sympy的“Mod()”转换为Python的“%”语法?

编辑:

下面是一个例子,我想:

Mod(x + 1, 3) 

成为:

(x+1)%3 

但我不想:

Mod(x, 3) 

是:

(x)%3 

我希望它是:

x%3 
+0

摆脱括号,你可以检查参数[优先](http://docs.sympy.org/dev/modules/printing.html#sympy.printing.precedence.precedence),但我很安静惊讶这并不存在。 –

+0

@ TadhgMcDonald-Jensen谢谢,但我仍然不知道这有什么帮助。也许你可以解释这有什么帮助。 –

回答

1

现在,我已经做的寻找到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请分享给我,因为我想更新我的答案。

+0

非常感谢。但它有一个小问题。第二个参数在需要时不用括号括起来(如果操作部分之外的操作具有比模数更高的优先级 - 'Mod('x',3)/ 3'当它变成'x%3/3'时应该变成'(x%3)/ 3')。虽然,我相信这不会很难解决。除此之外,它似乎工作得很好。 –

+0

嗯,其实我认为这将是很难解决的,因为它的工作,它将不得不确定,国防部具有相同的优先权作为功能似乎并没有前进,对不起,我可以帮不了那个:( –

相关问题