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? On 13 November 2011 02:21, Mateusz Paprocki <matt...@gmail.com> wrote: > Hi, > > On 12 November 2011 17:16, krastanov.ste...@gmail.com < > krastanov.ste...@gmail.com> wrote: > >> 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) >> > > Because sin is a Function and Function has a custom printer, which is not > true for Integral, which is just an ordinary type (default printer). > > >> >> Is this difference between function and integral expected? >> >> >> >> On 13 November 2011 02:09, Mateusz Paprocki <matt...@gmail.com> wrote: >> >>> Hi, >>> >>> On 12 November 2011 17:00, krastanov.ste...@gmail.com < >>> krastanov.ste...@gmail.com> wrote: >>> >>>> 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? >>> >>> >>> This seems to be a problem with IPython's printing hooks. In CPython I >>> get: >>> >>> >>> from sympy import * >>> >>> init_printing() >>> >>> var('x') >>> x >>> >>> sin(x).func >>> sin >>> >>> str(sin(x).func) >>> sin >>> >>> Integral(x, (x, 0, 1)).func >>> <class 'sympy.integrals.integrals.Integral'> >>> >>> str(Integral(x, (x, 0, 1)).func) >>> <class 'sympy.integrals.integrals.Integral'> >>> >>> There reason for different output in IPython is that IPython not always >>> uses SymPy's pretty printer, but sometimes uses its own printing hooks. >>> It's better visible in the notebook where latex output is used (e.g. try to >>> print data structures). >>> >>> >>>> >>>> >>>> On 13 November 2011 00:42, Aaron Meurer <asmeu...@gmail.com> wrote: >>>> >>>>> Hi. >>>>> >>>>> 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, krastanov.ste...@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, krastanov.ste...@gmail.com < >>>>> >> krastanov.ste...@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 sympy@googlegroups.com. >>>>> > To unsubscribe from this group, send email to >>>>> sympy+unsubscr...@googlegroups.com. >>>>> > For more options, visit this group at >>>>> http://groups.google.com/group/sympy?hl=en. >>>>> > >>>>> > >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "sympy" group. >>>>> To post to this group, send email to sympy@googlegroups.com. >>>>> To unsubscribe from this group, send email to >>>>> sympy+unsubscr...@googlegroups.com. >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/sympy?hl=en. >>>>> >>>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "sympy" group. >>>> To post to this group, send email to sympy@googlegroups.com. >>>> To unsubscribe from this group, send email to >>>> sympy+unsubscr...@googlegroups.com. >>>> For more options, visit this group at >>>> http://groups.google.com/group/sympy?hl=en. >>>> >>> >>> Mateusz >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "sympy" group. >>> To post to this group, send email to sympy@googlegroups.com. >>> To unsubscribe from this group, send email to >>> sympy+unsubscr...@googlegroups.com. >>> For more options, visit this group at >>> http://groups.google.com/group/sympy?hl=en. >>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sympy" group. >> To post to this group, send email to sympy@googlegroups.com. >> To unsubscribe from this group, send email to >> sympy+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/sympy?hl=en. >> > > Mateusz > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To post to this group, send email to sympy@googlegroups.com. > To unsubscribe from this group, send email to > sympy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sympy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to sympy@googlegroups.com. To unsubscribe from this group, send email to sympy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sympy?hl=en.