Bob Rogers wrote: > Given this class: > > class C(object): > def set_x(self, x): > self._x = x > > def get_x(self): > return self._x > > x = property(get_x, set_x) > > > This use of compile() and eval() works as I expected it to: > > c = C() > c.x = 5000 > n = '\'five thousand\'' > code = compile('c.x = ' + n, '<input>', 'exec') > print 'before ', c.x > eval(code) > print 'after ', c.x
I believe it is an implementation accident that this works. > > But this, using eval() without compile(), does not: > > c = C() > c.x = 5000 > n = '\'five thousand\'' > print 'before ', c.x > eval('c.x = ' + n) > print 'after ', c.x > > It gives: > > before 5000 > Traceback (most recent call last): > File "./r.py", line 16, in ? > eval('c.x = ' + n) > File "<string>", line 1 > c.x = 'five thousand' > ^ > SyntaxError: invalid syntax > > Could someone please explain just what is going on here, and whether it > is possible to dispense with the compile step and use eval() alone > while setting a property? Use eval(s) to evaluate an expression and exec s to execute a statement. Peter -- http://mail.python.org/mailman/listinfo/python-list