On Oct 17, 3:41 pm, Paul Melis <[EMAIL PROTECTED]> wrote: > On Oct 17, 3:20 pm, Marc 'BlackJack' Rintsch <[EMAIL PROTECTED]> wrote: > > > > > On Wed, 17 Oct 2007 05:57:50 -0700, Paul Melis wrote: > > > On Oct 17, 2:39 pm, Duncan Booth <[EMAIL PROTECTED]> wrote: > > >> >>> class C(object): > > > >> def setx(self, value): > > >> if len(value)>2: > > >> raise ValueError > > >> self._x = value > > >> def getx(self): > > >> return self._x > > >> x = property(getx, setx) > > > >> >>> o = C() > > >> >>> o.x = [] > > >> >>> o.x += ['a'] > > >> >>> o.x += ['b'] > > >> >>> o.x += ['c'] > > > >> Traceback (most recent call last): > > >> File "<pyshell#27>", line 1, in <module> > > >> o.x += ['c'] > > >> File "<pyshell#22>", line 4, in setx > > >> raise ValueError > > >> ValueError > > > >> >>> o.x > > >> ['a', 'b', 'c'] > > > > Now that's really interesting. I added a print "before" and print > > > "after" statement just before and after the self._x = value and these > > > *do not get called* after the exception is raised when the third > > > element is added. > > > Well, of course not. Did you really expect that!? Why? > > Because o.x *is* updated, i.e. the net result of self._x = value is > executed.
Argh, the getter is of course used to append the third element, after which the rebinding triggers the exception. Got it now... Paul -- http://mail.python.org/mailman/listinfo/python-list