SymPy 的 UnevaluatedExpr 如何正确显示负系数表达式?
数据小陈
结论
示例显示,问题出在 UnevaluatedExpr 的字符串显示:负号被提到了括号外,导致输出无法忠实呈现被包装的表达式。要保留未求值表达式并显示原始符号,可以单独处理输出格式。示例中的 str、sstr 和 latex 都无法保留这种括号形式。
下面的辅助函数适用于外层为 Add 且包含 UnevaluatedExpr 项的表达式。它直接格式化包装项的内部表达式,并为该项加上括号;其他项则交给 sstr 处理。
from sympy import Add, UnevaluatedExpr, sstr
def display_sum(expr):
terms = expr.args if isinstance(expr, Add) else (expr,)
rendered = []
for term in terms:
if isinstance(term, UnevaluatedExpr):
rendered.append(f"({sstr(term.args[0])})")
else:
rendered.append(sstr(term))
return " + ".join(rendered)
例如,对 ue1 + ue2 调用 display_sum(ue1 + ue2),会根据每个包装项的内部表达式生成带括号的文本,形式如下:
(-5*x**2 + 6*x - 7) + (-2*x**2 + 3*x + 2)
注意事项
这个函数只生成显示文本,不会改变 SymPy 表达式,也不适用于后续符号运算。它面向外层 Add 中的 UnevaluatedExpr 项;表达式结构不同时,需要根据实际结构调整格式化逻辑。
如果无需保留未求值的各项,可以对表达式调用 .doit(),再输出计算结果。按题目给出的示例,结果为 -2*x**2 - 9*x + 6。这种做法会改变展示目标,因此不适用于需要保留原始分项形式的场景。
备注:内容仅供参考。
