@classmethod
def fromsympy(cls, expr):
"""
- Create a linear expression from a sympy expression. Raise ValueError is
+ Create a linear expression from a sympy expression. Raise TypeError is
the sympy expression is not linear.
"""
import sympy
coefficient = Fraction(coefficient.p, coefficient.q)
if symbol == sympy.S.One:
constant = coefficient
+ elif isinstance(symbol, sympy.Dummy):
+ # we cannot properly convert dummy symbols
+ raise TypeError('cannot convert dummy symbols')
elif isinstance(symbol, sympy.Symbol):
symbol = Symbol(symbol.name)
coefficients.append((symbol, coefficient))
else:
- raise ValueError('non-linear expression: {!r}'.format(expr))
- return LinExpr(coefficients, constant)
+ raise TypeError('non-linear expression: {!r}'.format(expr))
+ expr = LinExpr(coefficients, constant)
+ if not isinstance(expr, cls):
+ raise TypeError('cannot convert to a {} instance'.format(cls.__name__))
+ return expr
def tosympy(self):
"""
def _repr_latex_(self):
return '$${}$$'.format(self.name)
- @classmethod
- def fromsympy(cls, expr):
- import sympy
- if isinstance(expr, sympy.Dummy):
- return Dummy(expr.name)
- elif isinstance(expr, sympy.Symbol):
- return Symbol(expr.name)
- else:
- raise TypeError('expr must be a sympy.Symbol instance')
-
def symbols(names):
"""
else:
return '$$\\frac{{{}}}{{{}}}$$'.format(self.numerator,
self.denominator)
-
- @classmethod
- def fromsympy(cls, expr):
- import sympy
- if isinstance(expr, sympy.Rational):
- return Rational(expr.p, expr.q)
- elif isinstance(expr, numbers.Rational):
- return Rational(expr)
- else:
- raise TypeError('expr must be a sympy.Rational instance')
self.assertEqual(LinExpr.fromsympy(sp_x), self.x)
self.assertEqual(LinExpr.fromsympy(sympy.Rational(22, 7)), self.pi)
self.assertEqual(LinExpr.fromsympy(sp_x - 2*sp_y + 3), self.expr)
- with self.assertRaises(ValueError):
+ with self.assertRaises(TypeError):
LinExpr.fromsympy(sp_x*sp_y)
@requires_sympy