00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 __doc__="""This is an ordered dictionary implementation to be used to
00021 store client data before transmission to the server."""
00022
00023 from itertools import imap, izip
00024
00025 class OrdDict( dict ):
00026 """
00027 OrdData.__init__(raw) -> OrdData object
00028
00029 A modified dictionary, that maintains the order of items.
00030 Data can be accessed as attributes or items.
00031 """
00032
00033 def __new__(cls, *args, **kwargs):
00034 inst = super(OrdDict, cls).__new__(cls, *args, **kwargs)
00035 inst.__dict__['_field_order'] = []
00036 return inst
00037
00038 def __getattr__(self, name):
00039 try:
00040 return super(OrdDict, self).__getattr__(name)
00041 except AttributeError:
00042 try:
00043 return self[name]
00044 except KeyError:
00045 raise AttributeError(str(name))
00046
00047 def __setattr__(self, name, value):
00048 if name in self.__dict__:
00049 super(OrdDict, self).__setattr__(name, value)
00050 else:
00051 self[name] = value
00052
00053 def __delattr__(self, name):
00054 try:
00055 super(OrdDict, self).__delattr__(name)
00056 except AttributeError:
00057 del self[name]
00058
00059 def __setitem__(self, name, value):
00060 if name not in self:
00061 self._field_order.append(name)
00062 super(OrdDict, self).__setitem__(name, value)
00063
00064 def __delitem__(self, name):
00065 super(OrdDict, self).__delitem__(name)
00066 self._field_order.remove(key)
00067
00068 def update(self, *data, **kwdata):
00069 if len(data) == 1:
00070 try:
00071 for k,v in data[0].iteritems():
00072 self[k] = v
00073 except AttributeError:
00074 for k,v in iter(data[0]):
00075 self[k] = v
00076 if len(kwdata):
00077 for k,v in kwdata.iteritems():
00078 self[k] = v
00079
00080 def __iter__(self):
00081 return self.iterkeys()
00082
00083 def iterkeys(self):
00084 return iter(self._field_order)
00085
00086 def keys(self):
00087 return list(self.iterkeys())
00088
00089 def itervalues(self):
00090 return imap(self.get, self.iterkeys())
00091
00092 def values(self):
00093 return list(self.itervalues())
00094
00095 def iteritems(self):
00096 return izip(self.iterkeys(), self.itervalues())
00097
00098 def items(self):
00099 return list(self.iteritems())
00100
00101 def copy(self):
00102 c = self.__class__()
00103 for k,v in self.items():
00104 try:
00105 c[k] = v.copy()
00106 except AttributeError:
00107 c[k] = v
00108 for k,v in self.__dict__.items():
00109 try:
00110 c[k] = v.copy()
00111 except AttributeError:
00112 c.__dict__[k] = v
00113 return c
00114
00115 def clear(self):
00116 super(OrdDict, self).clear()
00117 self._field_order = []
00118
00119
00120
00121