# 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 ToExpressiondescribed 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?

edit retag close merge delete

The fact that

SR('integrate(exp(x),x)')


fails but

SR('integral(exp(x),x)')


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.

Sort by » oldest newest most voted

If you're happy using the bindings that are available on top-level you can do

sage_eval('exp(x)',locals=globals())


The semantics of sage/python are simply not consistent with assuming that any unbound identifier is a symbolic variable. You could write something yourself, first use python to parse the string, collect all the names occurring and look up if those are bound, and insert bindings for the ones that are not.

more

The above I am afraid does not work in all cases. Here is an example

sage: var('x')
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
-1/2*x/(x^2 + 1) + 1/2*arctan(x) + integrate(-1/2*(3*x^10 - 4*x^9 + 5*x^8 - 2*x^7 + 15*x^6 + 6*x^5 + 9*x^4)/(2*x^13 + 7*x^11 - 4*x^10 + 11*x^9 - 11*x^8 + 13*x^7 - 13*x^6 + 11*x^5 - 11*x^4 + 4*x^3 - 7*x^2 - 2*(x^12 + 3*x^10 - 2*x^9 + 3*x^8 - 6*x^7 + 2*x^6 - 6*x^5 + 3*x^4 - 2*x^3 + 3*x^2 + 1)*sqrt(x^2 + 1) - 2), x) + 1/6*log ...
(more)

I think this in fact does work in response to your original question: it converts a string which contains a valid Sage expression to a Sage expression. There is a separate problem that the command integrate(...) in the definition of expr does not produce such a string.

I don't think this is a problem with sage_eval. If I enter the value of expr directly into sage, it hangs too. It seems it's just a nasty integral for maxima.