class Record(object):
_identity_field = None
+ _default = {}
+ _format = {}
+
def get(self, field):
- try:
- return self.__getattribute__(field)
- except:
- return None
+ v = getattr(self, field, None)
+ if v is None:
+ return self._default.get(field)
+ return v
+
def _formatField(self, field):
v = self.get(field)
+ func = self._format.get(field)
+ if func:
+ return func(v)
if callable(v):
v = v()
- if hasattr(v, '__iter__'):
- if len(v) == 0:
- return '[]'
- else:
- return '[%d x %s]'%(len(v), type(v[0]))
- else:
+ if not hasattr(v, '__iter__'):
return repr(v)
+ if len(v) == 0:
+ return '[]'
+ return '[%d x %s]'%(len(v), type(v[0]).__name__)
+
+ @classmethod
+ def _ignore(cls):
+ return [cls._identity_field]
+
def _fields(self):
ignore = self._ignore()
- keys = sorted(self.__class__.__dict__.keys())
- return [(k,self._formatField(k)) for k in keys if k[0]!="_" and k not in ignore]
+ keys = sorted(self.c.keys())
+ return [(k,self._formatField(k)) for k in keys if k not in ignore]
+
def __repr__(self):
classname = self.__class__.__name__
if self._identity_field:
identity = self.__dict__.get(self._identity_field)
- identity = ' ' + (identity and repr(identity) or 'hash=%d'%hash(self))
+ identity = ' ' + (identity and repr(identity) or 'hash=%X'%hash(self))
else:
identity = ''
payload = ": "+payload
return "<%s%s%s>" % (classname, identity, payload)
- def _ignore(self):
- return [self._identity_field, 'c', 'query', 'get']
-
-class FormattableRecord(Record):
- _format = {}
- def _formatField(self, field):
- func = self._format.get(field)
- if func:
- return func(self.get(field))
- else:
- return super(FormattableRecord, self)._formatField(field)
-
-class NullableRecord(FormattableRecord):
- _default = {}
- def get(self, field):
- v = self.__dict__.get(field)
- if v != None:
- return v
- else:
- return self._default.get(field)