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

Jim Jewett jimjjewett at gmail.com
Fri Apr 22 23:36:19 CEST 2005


As best I can tell, the anonymous blocks are used to take 
care of boilerplate code without changing the scope -- exactly 
what macros are used for.  The only difference I see is that in 
this case, the macros are limited to entire (possibly compound) 
statements.  

To make this more concrete,

Guido:
>>     in synchronized(the_lock):
>>         BODY

Nick Coghlan:
> s/in/with/ to get PEP 310.
...

>Guido's recent screed crystallised the idea of writing resources
> as two-part generators:
...

[Adding Reinhold Birkenfeld's suggestion of a blank yield]

> def my_resource():
>    print "Hi!"     # Do entrance code
>    yield           # Go on with the contents of the 'with' block
>    print "Bye!"    # Do exit code

The macro itself looks reasonable -- so long as there is only 
ever one changing block inside the macro.  I'm not sure that 
is a reasonable restriction, but the alternative is ugly enough 
that maybe passing around locals() starts to be just as good.

What about a block that indicates the enclosed namespaces
will collapse a level?

defmacro myresource(filename):
    <make explicit calls to named callback "functions", but 
      within the same locals() scope.>

with myresource("thefile"):
    def reader(): 
        ...
    def writer():
        ...
    def fn():
        ....

Then myresource, reader, writer, and fn would share a
namespace without having to manually pass it around.

-jJ


More information about the Python-Dev mailing list