[Python-Dev] PEP 359: The "make" Statement

Steven Bethard steven.bethard at gmail.com
Thu Apr 13 22:21:15 CEST 2006


On 4/13/06, Phillip J. Eby <pje at telecommunity.com> wrote:
> At 01:51 PM 4/13/2006 -0600, Steven Bethard wrote:
> >Sorry, I'm not clear on exactly what you're suggesting.  Are you
> >suggesting I try to implement the make-statement using context
> >managers?  Or that I use a context manager to address Martin's
> >problem?
>
> Yes.  :)  Both.  Or neither.  What I'm suggesting is that you implement the
> *use cases* for the make statement using 'with' and a bit of getframe
> hackery.  Then, your PEP can be clearer as to whether there's actually any
> significant advantage to having a "make" statement.
>
> IOW, if "make" isn't anything more than yet another way to spell class
> decorators, metaclasses, or "with" statements, it's probably not a good
> idea to add it to the language.

I'm against using anything with getframe hackery but here are the use
cases written with the class/__metaclass__ abuse:

    class C(object):
        ...
        class x:
            __metaclass__ = property
            def get(self):
                ...
            def set(self):

    class ns:
        """This creates a namespace named ns with a badger attribute
        and a spam function"""
        __metaclass__ = namespace

        badger = 42

        def spam():
            ...

    class C(...):
        __metaclass__ = iterface
        ...

Those should be mostly equivalent[1], except that all of the
namespaces created will have additional __metaclass__ and __module__
attributes.  The question is, is the intent still clear?  When reading
these, especially for the "namespace" example, I expect the result to
be a class.  The fact that it's not will be thoroughly confusing for
anyone who doesn't know that metaclasses don't have to create class
objects, and at least mildly misleading even for those who do
understand metaclasses.

Generally, the make statement has the advantage of not totally
confusing your reader when your "class" statement creates something
which is not a class at all. ;-)

[1] So you don't have to check the PEP, here's what the make-statement
versions look like:

    class C(object):
        ...
        make property x:
            def get(self):
                ...
            def set(self):
                ...

    make namespace ns:
        """This creates a namespace named ns with a badger attribute
        and a spam function"""

        badger = 42

        def spam():
            ...

    make interface C(...):
        ...

STeVe
--
Grammar am for people who can't think for myself.
        --- Bucky Katt, Get Fuzzy


More information about the Python-Dev mailing list