On 10/21/2013 11:53 AM, Saager Mhatre wrote:
[snip]
That's pretty much what always foiled my attempts at understanding Python
MetaClasses, I was looking for power where there was none to find. The best
comparison I could find was to Groovy's Compile time AST transforms, but
even those are even more powerful as they drop down a level of abstraction
and hand you the AST for the an rated element.

I agree with you partially - MOP in python can get ugly, but there's plenty of power there. I'll try to explain, though this stuff is notoriously hard to articulate (may be just for me).

So the main role of metaprogramming was to expose the language's object system as an object model to the programmer, so that it could be queried and manipulated at runtime. Does python do this? Yes, but not quite in the way that Kiczales outlined.

Instead we get some rough-and-ready tools with which you can simulate the effects that a "proper" MOP system (such as in CLOS) might have, and when having to make a choice between flexibility vs performance and code clarity, python's designers have almost invariably chosen the latter.

To begin with, there is a level of metacircularity in the new-style type system:

>>> isinstance(object, object)
True
>>> isinstance(type, type)
True
>>> isinstance(object, type)
True
>>> isinstance(type, object)
True

This is what the metaclass system uses. With old-style classes, you had a lot of flexibility to change the class of objects at runtime. Nowadays there are a lot more restrictions, mostly due to performance, but you can still do some silly stuff:

>>> MyType = type('MyType', (type,), {})
>>> MyCircularType = MyType('MyCircularType', (MyType,), {})
>>> MyCircularType.__class__ = MyCircularType
>>> isinstance(MyCircularType, MyCircularType)
True

And then of course there's things like get/setattribute - combined with the abc module in the standard library, the type trickery above and python's basic metaclass system, you could effectively create your own metacircular MOP protocol on top of python.*

Another major issue is that python's syntax makes it just not a great language for embedded DSLs and MOP, even to the extent that other dynamic languages (Ruby!) are. That's not going to change though, and I'm personally okay with it for the most part. If I wanted to program CLOS, I'd program CLOS.

-Taj.

* In fact, I spent quite a while doing so a few years ago - implementing the OMG MOF on python - and it worked pretty well, but it proved difficult to get it to the point where I could even properly explain it to people.
_______________________________________________
BangPypers mailing list
BangPypers@python.org
https://mail.python.org/mailman/listinfo/bangpypers

Reply via email to