PAYATHON 2026

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。这种做法会改变展示目标,因此不适用于需要保留原始分项形式的场景。

备注:内容仅供参考。