I know only how to obtain the childes:
>>> e = x+y*sin(z) + z
>>> e.args
(y*sin(z), z, x)
>>> e.args[0]
>>> y*sin(z)
>>> e.args[0].args
(y, sin(z))
And test the classes:
>>> e.is_Add
True
In other words, the somewhat tree of the expressions exists.
How to represent expression-tree in other formats (strings or
structures), I do not know.
Regards.
--
Alexey U.
As far as I know, we don't have a function that does exactly that,
though I could be wrong. It would be nice to have one, though.
On Sat, Nov 12, 2011 at 11:01 AM, Alexey U. Gudchenko <pr...@goodok.ru> wrote:
> 12.11.2011 21:42, krastano...@gmail.com пишет:
>> This:
>>
>> import ast
>> ast.parse(repr(expression))
If you want a repr() representation, you should instead use srepr().
(repr() is the same as str()).
>>
>> will do the trick if repr is well coded.
str() is coded so that it returns the same thing back from sympify(),
but it may not give the same thing directly, because you can have
int/int in an expression. srepr() should always give the same thing
back.
>>
>> How much faith should I put in the repr strings in sympy? Or there is
>> another way?
>>
>> On 12 November 2011 18:20, krastano...@gmail.com <
>> krastano...@gmail.com> wrote:
>>
>>> Is there any way to get the expression tree from an expression (either
>>> using the python abstract syntax tree module or just some tuples):
>>>
>>> for example
>>>
>>> get_tree( x+y*sin(z) ) would return
>>>
>>> (Add, x, (Mul, y, (Sin z)))
>>>
>>> or
>>>
>>> (BinOp, Add, ((Symbol, x), (BinOp, Mul, (blah blah blah))))
>>>
>>
>
> I know only how to obtain the childes:
>
>>>> e = x+y*sin(z) + z
>>>> e.args
> (y*sin(z), z, x)
>
>>>> e.args[0]
>>>> y*sin(z)
>
>>>> e.args[0].args
> (y, sin(z))
>
>
>
> And test the classes:
>
>>>> e.is_Add
> True
>
You can get the class name by using .func:
In [25]: e = x + y
In [26]: e.func
Out[26]: sympy.core.add.Add
In [27]: e.func(*e.args)
Out[27]: x + y
The invariant in [27] should always hold (except for possibly some
differences in assumptions).
Aaron Meurer
>
>
>
> In other words, the somewhat tree of the expressions exists.
>
> How to represent expression-tree in other formats (strings or
> structures), I do not know.
>
> Regards.
>
> --
> Alexey U.
>
> --
> You received this message because you are subscribed to the Google Groups "sympy" group.
> To post to this group, send email to sy...@googlegroups.com.
> To unsubscribe from this group, send email to sympy+un...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/sympy?hl=en.
>
>
Ok, but why are those printed differently (ipython --profile=sympy):
In [34]: sin(x).func
Out[34]: sympy.functions.elementary.trigonometric.sin
In [35]: str(sin(x).func)
Out[35]: sin
In [39]: Integral(x, (x,0,1)).func
Out[39]: sympy.integrals.integrals.Integral
In [40]: str(Integral(x, (x,0,1)).func)
Out[40]: <class 'sympy.integrals.integrals.Integral'>
What should I do to have them print in the same manner?
Then I suppose I can just call a function that returns a string. Here is the problem I have:
In [42]: lambdarepr(Integral(x, (x,0,1)).func)
Out[42]: <class 'sympy.integrals.integrals.Integral'>
In [43]: lambdarepr(Integral(x, (x,0,1)))
Out[43]: Integral(x, (x, 0, 1))
Why is out[42] not the same style as out[43]. This causes problems with lambdify, so I would be very happy if somebody explains this to me. With 'sin' it gives the same style for both inputs:
In [46]: lambdarepr(sin(x).func)
Out[46]: sin
In [47]: lambdarepr(sin(x))
Out[47]: sin(x)
Can the default printer be changed so lambdarepr(SomeClass(args)) and lambdarepr(SomeClass(args).func) give always the same thing.
lambdarepr is using LambdaPrinter. What should be done there (or to a subclass of LambdaPrinter) to ensure the behavior that I desire?