#python #sympy
Вопрос:
Цель состоит в том, чтобы отобразить объекты sympy (которые все наследуются от класса Printable) не в sstr (), а в latex() по умолчанию
Пример:
from sympy import symbols, sqrt x, y = symbols('x y') print(f'its {sqrt(x)} and {sqrt(y)}') #output: 'its \sqrt(x) and \sqrt(y)'
Это сработает, если я изменю метод класса для редактирования исходного кода sympy для печати __str__
. Существуют ли какие-либо способы сделать импортированные классы sympy наследуемыми от моего класса, а не от исходного, без редактирования фактического источника?
Я попробовал это:
from sympy.core._print_helpers import Printable class PrintableWrapper(Printable): def __str__(self): from sympy.printing.latex import latex return latex(self, mode='plain') __repr__ = __str__ Printable = PrintableWrapper from sympy import Symbol, sqrt Printable = PrintableWrapper A = Symbol("A") print(f'{sqrt(A)}') #output: 'sqrt(A)'
Но, как вы можете видеть, это не работает
Причина, по которой я спрашиваю, заключается в том, что я использую функции отображения Ipython(Математика(f’…’)) для отображения материалов, и мне нужно завернуть любой отдельный объект sympy в latex (), как это:
display(Math(f'its {latex(sqrt(x))} and {latex(sqrt(y))}''))
Так что любые решения для f'its {sqrt(x)} and {sqrt(y)}'
работы приветствуются
Ответ №1:
Вам необходимо переопределить функцию во внутреннем классе, расширение класса сохраняет внутренний класс неизменным.
from sympy.core._print_helpers import Printable from sympy.printing.latex import latex class PrintableWrapper: def __str__(self): return latex(self, mode='plain') __repr__ = __str__ Printable.__repr__ = PrintableWrapper.__str__ Printable.__str__ = PrintableWrapper.__str__ from sympy import Symbol, sqrt Printable = PrintableWrapper A = Symbol("A") print(f'{sqrt(A)}')