Hi,

I have what in my eyes seems a challenging problem.
Thanks to Peter Otten, i got the following code to work. It is a sort
of named tuple.
from operator import itemgetter
def constgetter(value):
        def get(self): return value
        return get
def createTuple(*names):
        class TupleType(type):
                pass
        class T(tuple):
                __metaclass__ = TupleType
                def __new__(cls, *args):
                        if len(names) != len(args):
                                raise TypeError
                        return tuple.__new__(cls, args)
        for index, name in enumerate(names):
                setattr(T, name, property(itemgetter(index)))
                setattr(TupleType, name, property(constgetter(index)))
        return T
if __name__ == '__main__':
        Point=makeTuple('x','y')
        p=Point(4,7)
        assert p.x==p[0]
        assert p.y==p[1]
        assert Point.x==0
        assert Point.y==1

Now my problem is the following. I want to write a function called
createDerivedTuple in order to create a class derived from the one
created with the function createTuple, taking the parent class as first
argument:
def createDerivedTuple(parentclass,*names):
        ....... code yet to be figured out ....

The usage should be as follows:

DerivedPoint=makeDerivedTuple(Point,'z')
p=DerivedPoint(4,7,9)
assert p.x==p[0]
assert p.y==p[1]
assert p.z==p[2]
assert DerivedPoint.x==0
assert DerivedPoint.y==1
assert DerivedPoint.z==2

I am still a newbie on metaclasses but i am convinced there are elegant
solutions to this challenging problem.

Best regards

Alain

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to