def select(self, fields, **exprs):
        fields = self._parse_fields_string(fields)
        def _make_string_callable(expr):
            if isinstance(expr, basestring):
                return lambda r: expr % r
            else:
                return expr
        exprs = dict((k, _make_string_callable(v)) for k, v in exprs.items())
        raw_tuples = []
        for ob in self.obs:
            attrvalues = tuple(getattr(ob, fieldname, None) for fieldname in fields)
            if exprs:
                attrvalues += tuple(expr(ob) for expr in exprs.values())
            raw_tuples.append(attrvalues)
        all_names = tuple(fields) + tuple(exprs.keys())
        ret = Table()
        ret._indexes.update(dict((k, v.copy_template()) for k, v in self._indexes.items() if k in all_names))
        return ret().insert_many(DataObject(**dict(zip(all_names, outtuple))) for outtuple in raw_tuples)