Python中不修改SymPy源码实现对象默认输出LaTeX格式的方法咨询
可行解决方案:猴子补丁修改Printable原生类方法
你之前的方案不生效的核心原因是:Python类的继承关系在子类定义时就已经固定,你只是修改了当前作用域内Printable变量的指向,SymPy内置所有继承自Printable的子类(比如Symbol、各类表达式实现类)的父类引用还是指向原生Printable类,不会随你变量的重赋值变更。
直接修改原生Printable类的魔术方法即可全局生效,无需修改SymPy源码:
完整实现代码
# 第一步:先导入Printable和latex方法 from sympy.core._print_helpers import Printable from sympy.printing.latex import latex # 备份原生方法(可选,需要恢复默认输出时使用) _printable_original_str = Printable.__str__ _printable_original_repr = Printable.__repr__ _printable_original_format = Printable.__format__ # 定义新的输出方法 def _printable_latex_str(self): return latex(self, mode='plain') def _printable_latex_format(self, format_spec): return format(latex(self, mode='plain'), format_spec) # 替换原生类的魔术方法 Printable.__str__ = _printable_latex_str Printable.__repr__ = _printable_latex_str Printable.__format__ = _printable_latex_format
效果测试
from sympy import symbols, sqrt x, y = symbols('x y') # 直接用f-string即可得到latex格式输出 print(f'its {sqrt(x)} and {sqrt(y)}') # 输出:its \sqrt{x} and \sqrt{y} # IPython场景直接使用,无需额外套latex() from IPython.display import display, Math display(Math(f'its {sqrt(x)} and {sqrt(y)}'))
可选:恢复默认输出
如果临时需要使用SymPy原生的字符串输出,执行以下代码即可恢复:
Printable.__str__ = _printable_original_str Printable.__repr__ = _printable_original_repr Printable.__format__ = _printable_original_format
内容的提问来源于stack exchange,提问作者Павел Фуров
相关产品推荐
相关产品推荐

