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