没有对齐Sympy对分裂的好处

Jer*_*meJ 13 python sympy

我正在尝试用Sympy打印一些分区,但我注意到它没有显示对齐.

import sympy
sympy.init_printing(use_unicode=True)

sympy.pprint(sympy.Mul(-1, sympy.Pow(-5, -1, evaluate=False), evaluate=False))
# Output:
# -1 
# ???
#  -5  # Note that "-5" is displayed slightly more on the right than "-1".
Run Code Online (Sandbox Code Playgroud)

理由/解决这个问题?

编辑:我做了很多逆向工程使用inspect.getsource,inspect.getsourcefile但它最终并没有真​​正帮助.

Sympy的Pretty Printing似乎依赖于Jurjen Bos的Prettyprinter.

import sympy

from sympy.printing.pretty.stringpict import *

sympy.init_printing(use_unicode=True)

prettyForm("-1")/prettyForm("-5")
# Displays:
# -1
# --
# -5
Run Code Online (Sandbox Code Playgroud)

所以它显示对齐,但我不能让它使用unicode.

该PrettyPrinter从文件调用sympy/printing/pretty/pretty.py的方法PrettyPrinter._print_Mul简单地return prettyForm.__mul__(*a)/prettyForm.__mul__(*b)用,我想,ab简单地['-1']['-5'],但它不会工作.

Jer*_*meJ 2

找出奇怪的部分来自哪里:

\n\n

stringpict.py第 417 行:

\n\n
        if num.binding==prettyForm.NEG:\n            num = num.right(" ")[0]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这仅针对分子进行。如果分子为负数\xe2\x80\xa6,它会在分子后面添加一个空格 奇怪!

\n\n

我不确定除了直接编辑文件之外是否可以修复。我将在 Github 上报告此事。

\n\n

感谢大家的帮助和建议。

\n\n

PS:最后,我常常pdb帮我调试并弄清楚到底发生了什么!

\n\n

编辑:如果您不能/不想编辑代码源,请进行修补程序:

\n\n
import sympy\nsympy.init_printing(use_unicode=True)\n\nfrom sympy.printing.pretty.stringpict import prettyForm, stringPict\n\ndef newDiv(self, den, slashed=False):\n    if slashed:\n        raise NotImplementedError("Can\'t do slashed fraction yet")\n    num = self\n    if num.binding == prettyForm.DIV:\n        num = stringPict(*num.parens())\n    if den.binding == prettyForm.DIV:\n        den = stringPict(*den.parens())\n\n    return prettyForm(binding=prettyForm.DIV, *stringPict.stack(\n        num,\n        stringPict.LINE,\n        den))\n\nprettyForm.__div__ = newDiv\n\nsympy.pprint(sympy.Mul(-1, sympy.Pow(-5, -1, evaluate=False), evaluate=False))\n\n# Displays properly:\n# -1\n# \xe2\x94\x80\xe2\x94\x80\n# -5\n
Run Code Online (Sandbox Code Playgroud)\n\n

我只是从代码源复制了该函数并删除了有罪的行。

\n\n

可能的改进可能是对functools.wraps原始功能的新功能。

\n