Родительский класс «Substitude» в python или по умолчанию делает объекты Sympy отображаемыми в latex

#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)}')