我正在尝试用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)用,我想,a和b简单地['-1']和['-5'],但它不会工作.
找出奇怪的部分来自哪里:
\n\nstringpict.py第 417 行:
if num.binding==prettyForm.NEG:\n num = num.right(" ")[0]\nRun Code Online (Sandbox Code Playgroud)\n\n这仅针对分子进行。如果分子为负数\xe2\x80\xa6,它会在分子后面添加一个空格 奇怪!
\n\n我不确定除了直接编辑文件之外是否可以修复。我将在 Github 上报告此事。
\n\n感谢大家的帮助和建议。
\n\nPS:最后,我常常pdb帮我调试并弄清楚到底发生了什么!
编辑:如果您不能/不想编辑代码源,请进行修补程序:
\n\nimport 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\nRun Code Online (Sandbox Code Playgroud)\n\n我只是从代码源复制了该函数并删除了有罪的行。
\n\n可能的改进可能是对functools.wraps原始功能的新功能。
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |