Super Tuples

Salva salvador at my-deja.com
Thu Dec 30 12:11:22 EST 1999


In article <386B2964.DAEE01CA at prescod.net>,
  Paul Prescod <paul at prescod.net> wrote:

> For this to work you would probably need tuple pre-declaration to set
up
> the namespace. Once you start pre-declaring you are basically into the
> world of object instances.

You are right, but predeclaring the structs you are going to use can be
very easy and it has additional benefits like better error checking.

And now another supertuple implementation that tries to go towards the c
struct idea...

------------------------------------------------------------------
#!/usr/local/bin/python


class Supertuple:

    def __init__(self,*slots):
        self.slots=slots
        reverse={}
        for i in range(0,len(slots)):
            reverse[slots[i]]=i
        self.reverse=reverse

    def __call__(self,*t,**d):
        return apply(Instance,(self,)+t,d)


class Instance:

    __inited=0

    def __init__(self,klass,*t,**d):
        self.__klass=klass
        values=[None]*len(klass.slots)

        for i in range(0,len(t)):
            values[i]=t[i]

        for (k,v) in d.items():
            index=klass.reverse[k]
            values[index]=v

        self.__values=values

        self.__inited=1

    def __getattr__(self,name):
        try:
            index=self.__klass.reverse[name]
            return self.__values[index]
        except KeyError:
            raise AttributeError,name


    def __setattr__(self,name,value):
        if not self.__inited:
            self.__dict__[name]=value
        else:
            try:
                index=self.__klass.reverse[name]
                self.__values[index]=value
            except KeyError:
                raise AttributeError,name

    def __getitem__(self,index):
        return self.__values[index]

    def __len__(self):
        return len(self.__values)

    def __strpair(self,index):
        return (self.__klass.slots[index]+
                '='+
                repr(self.__values[index]))

    def __str__(self):
        pairs=map(self.__strpair,
                  range(0,len(self.__values)))
        return ('('+
                reduce(lambda x,y: x+', '+y,
                       pairs)+
                ')')

    def __repr__(self):
        return self.__str__()


if __name__=='__main__':

    Date=Supertuple('month','day','year')

    d=Date('Dec',31,1999)
    print d
    month,day,year=d
    print month,day,year
    print d.year
    d.year=2000
    print d

    d2=Date(year=1000)
    d3=Date('Dec',year=3000)
    d4=Date(year=1400,month='Feb',day=34)
    print d2,d3,d4


    Point=Supertuple('x','y')

    p=Point()
    p.x=25;p.y=23
    print p


------------------------------------------------------------------

- Salva


Sent via Deja.com http://www.deja.com/
Before you buy.



More information about the Python-list mailing list