Shane Hathaway wrote: > Robert Brewer wrote: > > So currently, all subclasses just override __set__, which leads to a > > *lot* of duplication of code. If I could write the base > class' __set__ > > to call "macros" like this: > > > > def __set__(self, unit, value): > > self.begin() > > if self.coerce: > > value = self.coerce(unit, value) > > oldvalue = unit._properties[self.key] > > if oldvalue != value: > > self.pre() > > unit._properties[self.key] = value > > self.post() > > self.end() > > > > defmacro begin: > > pass > > > > defmacro pre: > > pass > > > > defmacro post: > > pass > > > > defmacro end: > > pass > > Here is a way to write that using anonymous blocks: > > def __set__(self, unit, value): > with self.setting(unit, value): > if self.coerce: > value = self.coerce(unit, value) > oldvalue = unit._properties[self.key] > if oldvalue != value: > with self.changing(oldvalue, value): > unit._properties[self.key] = value > > def setting(self, unit, value): > # begin code goes here > yield None > # end code goes here > > def changing(self, oldvalue, newvalue): > # pre code goes here > yield None > # post code goes here > ... > Which do you prefer? I like fewer methods. ;-)
I still prefer more methods, because my actual use-cases are more complicated. Your solution would work for the specific case I gave, but try factoring in: * A subclass which needs to share locals between begin and post, instead of pre and post. or * A set of 10 subclasses which need the same begin() but different end() code. Yielding seems both too restrictive and too inside-out to be readable, IMO. Robert Brewer MIS Amor Ministries [EMAIL PROTECTED] _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com