Strange metaclass behaviour
Michele Simionato
michele.simionato at gmail.com
Fri Mar 24 03:25:32 EST 2006
> After 5 years of Python, I still find it impressive how much
> vodoo and mojo one can do here :-)
True ;)
However, I should point out that I never use this stuff in production
code.
I have found out that for my typical usages metaclasses are too much:
a class decorator would be enough and much less fragile. At the
present, we
do not have class decorators, but we can nearly fake them with a very
neat
trick:
def thisclass(proc, *args, **kw):
""" Example:
>>> def register(cls): print 'registered'
...
>>> class C:
... thisclass(register)
...
registered
"""
# basic idea stolen from zope.interface, which credits P.J. Eby
frame = sys._getframe(1)
assert '__module__' in frame.f_locals # inside a class statement
def makecls(name, bases, dic):
try:
cls = type(name, bases, dic)
except TypeError, e:
if "can't have only classic bases" in str(e):
cls = type(name, bases + (object,), dic)
else: # other strange errors, such as __slots__ conflicts, etc
raise
del cls.__metaclass__
proc(cls, *args, **kw)
return cls
frame.f_locals["__metaclass__"] = makecls
Figured you would like this one ;)
Michele Simionato
More information about the Python-list
mailing list