On Fri, Jun 20, 2008 at 12:00:09PM +0200, Ondrej Certik wrote: > > On Fri, Jun 20, 2008 at 11:49 AM, Riccardo Gori <[EMAIL PROTECTED]> wrote: > > > > On Friday 20 June 2008 10:31:15 Ondrej Certik wrote: > >> On Thu, Jun 19, 2008 at 3:20 PM, Riccardo Gori <[EMAIL PROTECTED]> wrote: > >> > Hello, > >> > I'm working at fixing issue 888. It is easy to fix but I don't understand > >> > why in sympy/utilities/lambdify.py I found that lambdastr function does > >> > use __str__ for expr. > >> > > >> > def lambdastr(args, expr): > >> > """ > >> > Returns a string that can be evaluated to a lambda function. > >> > > >> > >>> from sympy import symbols > >> > >>> x,y,z = symbols('xyz') > >> > >>> lambdastr(x, x**2) > >> > > >> > 'lambda x: (x**2)' > >> > > >> > >>> lambdastr((x,y,z), [z,y,x]) > >> > > >> > 'lambda x,y,z: ([z, y, x])' > >> > """ > >> > # Transform everything to strings. > >> > expr = str(expr) > >> > if isinstance(args, str): > >> > pass > >> > elif hasattr(args, "__iter__"): > >> > args = ",".join(str(a) for a in args) > >> > else: > >> > args = str(args) > >> > > >> > return "lambda %s: (%s)" % (args, expr) > >> > > >> > But in python doc we can read: > >> > > >> > (http://docs.python.org/ref/customization.html) > >> > ################################ > >> > __repr__( self) > >> > Called by the repr() built-in function and by string conversions > >> > (reverse quotes) to compute the ``official'' string representation of an > >> > object. If at all possible, this should look like a valid Python > >> > expression that could be used to recreate an object with the same value > >> > (given an appropriate environment). If this is not possible, a string of > >> > the form "<...some useful description...>" should be returned. The return > >> > value must be a string object. If a class defines __repr__() but not > >> > __str__(), then __repr__() is also used when an ``informal'' string > >> > representation of instances of that class is required. > >> > > >> > This is typically used for debugging, so it is important that the > >> > representation is information-rich and unambiguous. > >> > > >> > __str__( self) > >> > Called by the str() built-in function and by the print statement to > >> > compute the ``informal'' string representation of an object. This differs > >> > from __repr__() in that it does not have to be a valid Python expression: > >> > a more convenient or concise representation may be used instead. The > >> > return value must be a string object. > >> > ################################ > >> > > >> > As I understand __repr__ should be used to have a pythonic valid > >> > expression and __str__ should be a normal string. But sympy Basic > >> > __repr__ > >> > implementation returns unicode text with repr_level_2 so we can't use it > >> > in eval(). > >> > > >> > This is also discussed in issue 697. > >> > > >> > I suggest to change this behaviour, so we can make lambdify more robust. > >> > Is someone working at this? > >> > >> Hi Riccardo, > >> > >> sorry for a late reply, I am at a PMAA08[1] conference now, so I get > >> to emails sporadically. > >> > >> please go ahead and fix the __repr__ and __str__ methods. As you > >> rightly cited, let's follow the python policy, i.e. __repr__ to be > >> something evaluable (or at least something that sympify can handle) > >> and __str__ a normal string. And get rid of set_repr_level() > >> completely. Let's use > >> > >> pprint > >> > >> for nice unicdoe asciiart printing and other methods for other style > >> of printing. > >> > >> The only thing I am not sure now -- what should be the difference > >> between __str__ and __repr__ then? I know we discussed it in the > >> issues, but I don't think we came to a conclusion. I think the __str__ > >> should return a good looking string, but this behaviour should not > >> change using some global state (set_repr_level). Then there should be > >> functions like pprint, or print_tree or print_unicode to do other > >> kinds of printing. And as to __repr__, I know it should be something > >> evaluable, but the quesiton is, whether > >> > >> (sympify(1)/2).__repr__ > >> > >> should return "1/2" or "sympify(1)/2" (or something else). Note, that > >> in isympy, we use the "pprint" method, so the comfort way of using > >> sympy will not change by how __repr__ looks like. If you use regular > >> python shell, you can also easily hook up pprint, e.g. > >> > >> >>> from sympy import pprint > >> >>> import sys > >> >>> sys.displayhook = pprint > >> >>> from sympy.abc import x > >> >>> x > >> > >> x > >> > >> >>> x**2 > >> > >> 2 > >> x > >> > >> so it seems to me, that __repr__ should really return something that > >> you can directly evaluate, i.e. > >> > >> (sympify("1/2").__repr_ > >> > >> should return sympify(1)/2, or Integer(1)/2, or something like that. > > > > Hello, > > I think that repr() should return an evaluable expression that returns the > > same type of the called object: > > i.e. > > > > In [1]: Basic.set_repr_level(0) > > Out[1]: 1 > > > > In [2]: repr(sympify("1/2")) > > Out[2]: Half(1, 2) > > > > It should not returns 1/2 because evaluating 1/2 returns a float: > > > > In [3]: Basic.set_repr_level(1) > > Out[3]: 0 > > > > In [4]: repr(sympify("1/2")) > > Out[4]: 1/2 > > > > In [5]: type(eval(repr(sympify("1/2")))) > > Out[5]: <type 'float'> > > > > In this particoular case the problem is that Half is not imported in the > > namespace so we can't evaluate it, so a solution is to implement __repr__ > > that returns a function that returns an Half(): something like: > > > > In: repr(sympify("1/2")) > > Out: Rational(1,2) > > In: type(Rational(1,2)) > > Out: <class 'sympy.core.numbers.Half'> > > Yes, I agree with this. > > Also, let's get rid of set_repr_level()? This is quite an important > change, so I'd like to hear opinions of others as well.
We already had this discussion in the past: http://code.google.com/p/sympy/issues/detail?id=697 And I think repr(x) should be "Symbol('x')", str(x) should be "x" and there should be no Basic.set_repr_level. -- Всего хорошего, Кирилл. --~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sympy?hl=en -~----------~----~----~----~------~----~------~--~---