假设我正在构建一个类,在其中我有一个__repr__
方法来打印它。有没有办法使用sympy的乳胶打印来呈现__repr__
输出?
对于最小的例子,请考虑
e1, e2, e3 = sympy.symbols('e_1 e_2 e_3')
class vector:
def __init__(self, _coordinates, _basis):
self.coordinates = coordinates
self.basis = basis
def __repr__(self):
string = ''
for k in range(len(basis)):
string += '{}{} + '.format(self.coordinates[k], self.basis[k])
return string[:-3]
在这个示例中,如果我创建一个这样的实例:v = vector([1, 0, 0], [e1, e2, e3])
我希望print(v)
看起来像$ 1e_1 + 0e_2 + 0e_3 $。有没有办法实现这个目标?
答案 0 :(得分:1)
我不确定我是否理解对sympy.add
的限制。这样就够了吗?
import sympy as sym
import sympy.printing as printing
e1, e2, e3 = sym.symbols('e_1 e_2 e_3')
class Vector:
def __init__(self, _coordinates, _basis):
self.coordinates = _coordinates
self.basis = _basis
def __repr__(self):
expr = sum([c*e for c, e in zip(self.coordinates, self.basis)])
return '${}$'.format(printing.latex(expr))
v = Vector([1, 0, 0], [e1, e2, e3])
print(repr(v))
# $e_{1}$
v = Vector([1, 2, 3], [e1, e2, e3])
print(repr(v))
# $e_{1} + 2 e_{2} + 3 e_{3}$
答案 1 :(得分:1)
IPython笔记本中的Sympy对象的LaTeX显示由IPython的display
模块处理。如果对象定义了_repr_latex_()
函数,则在调用Sympy init_printing()
时,IPython将呈现对象的LaTeX表示。以下代码应与IPython一起使用。在最新版本的IPython中,不需要导入display()
函数。对于旧版本,我们可能必须包含from IPython.display import display
。
import sympy as s
s.init_printing()
class vector:
def __init__(self, _coordinates, _basis):
self.coordinates = _coordinates
self.basis = _basis
def __repr__(self):
string = ''
for k in range(len(self.basis)):
string += '{}{} + '.format(self.coordinates[k], self.basis[k])
return string[:-3]
def _repr_latex_(self):
string = self.__repr__()
string = '$' + string + '$'
return string
e1, e2, e3 = s.symbols('e_1 e_2 e_3')
v = vector([1, 0, 0], [e1, e2, e3])
display(v)