How to convert string to sage expression?
In python one can use parse_expr
to convert a string which contains valid sympy expression to an sympy expression.
I can't find how to do the same in sage. I tried eval
but this works sometimes and not other times. Here is an example
var('x')
sage: expr=sin(x)
sage: expr=str(expr)
sage: expr=eval(expr)
sin(x)
But not on this one
sage: expr=-1/2*x/(x^2 + 1)
sage: expr=str(expr)
sage: expr=eval(expr)
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-16-599d1fa18625> in <module>()
----> 1 expr=eval(expr)
<string> in <module>()
/usr/lib/python2.7/site-packages/sage/structure/element.pyx in sage.structure.element.Element.__xor__ (build/cythonized/sage/structure/element.c:8986)()
951
952 def __xor__(self, right):
--> 953 raise RuntimeError("Use ** for exponentiation, not '^', which means xor\n"+\
954 "in Python, and has the wrong precedence.")
955
RuntimeError: Use ** for exponentiation, not '^', which means xor
in Python, and has the wrong precedence.
I do not know before hand the "type" of the expression, other than it is valid sage expression, but in a string.
I found I could do this
sage: var('x')
sage: expr=-1/2*x/(x^2 + 1)
sage: expr=str(expr)
sage: expr=sage_eval(expr,locals={'x':x})
sage: expr
-1/2*x/(x^2 + 1)
and it works. But this means I need to know before hand that 'x' symbol was there. Which is not possible for me.
I am looking for something similar to Mathematica's ToExpression
described in
http://reference.wolfram.com/language... or python parse_expr
I found answer here https://ask.sagemath.org/question/411... using something called SR
which I still do not understand, but it does not work for me.
sage: expr=integrate(x^2*(sqrt(x^2 + 1) - 2)/((x^3 - (x^2 + 1)^(3/2) - 1)*sqrt(x^2 + 1)), x)
sage: expr=str(expr)
sage: expr=SR(expr)
TypeError Traceback (most recent call last)
So, how would one convert string that contains arbitrary sage valid expression to sage expression?
The fact that
fails but
succeeds is probably something that can be fixed:
integrate
should be able to do indefinite integrals as well. I think you can file an enhancement ticket for that. That's going to be easy to do.