[Python-Dev] defmacro (was: Anonymous blocks)

Shane Hathaway shane at hathawaymix.org
Mon Apr 25 23:29:01 CEST 2005


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 would require macro-blocks which were decidedly *not*
> anonymous) then I could more cleanly write a subclass with additional
> "macro" methods:
> 
>     defmacro pre:
>         old_children = self.children()
>     
>     defmacro post:
>         for child in self.children:
>             if child not in old_children:
>                 notify_somebody("New child %s" % child)

    def changing(self, oldvalue, newvalue):
        old_children = self.children()
        yield None
        for child in self.children:
            if child not in old_children:
                notify_somebody("New child %s" % child)

Which do you prefer?  I like fewer methods. ;-)

Shane


More information about the Python-Dev mailing list