Best way to enumerate something in python

tutu milas_gi at hotmail.com
Thu May 27 13:50:28 EDT 2004


> 
> insrtCommand = ' select ' + columns[1] + ',' + columns[2] + ' from ' 
> blah.......
> 
> from a maintenance standpoint, the programmer can't tell what column 1 is 
> supposed to refer to.   however if i had something like
> 
> columns[HOUSING_ID]    instead of the '1' then the programmer would later at 
> a glance be able to follow the code.
> 
I've been using something like the following (maybe it helps):
import types

class Field(object):
    "a field has a name , a value and an index in a row from a rowset"
    def __init__(self, name, value, idx):
        self.name =name
        self.value=value
        self.index=idx
    def __repr__(self): return self.name
    
class Fields(object):
    def __init__(self, fields_dict):
        self._fields = fields_dict
        self.fieldsCount = len(self._fields.keys())
        self.row = None

    def _setFields(self):
        self._fldName = {}
        self._fldIdx = {}
        for nm, idx in self._fields.items():
            self._fldName[nm] = self._fldIdx[idx] = Field(nm,
self._row is not None and self._row[idx] or None, idx)
            
    def __getitem__(self, fld):
        if type(fld) in [types.IntType, types.LongType]:
            if 0<=fld<=self.fieldsCount-1: return self._fldIdx[fld]
            raise IndexError, "Index out of bounds %d" % fld
        elif type(fld) in [types.StringType, types.UnicodeType]:
            if self._fldName.has_key(fld):
                return self._fldName[fld]
            raise ValueError, "No such field %s" % idx
        else:
            raise ValueError, "key may only be a text (field_name) or
a number (field index in row)"
        
    def setRow(self, rowLst): 
        self._row = rowLst
        self._setFields()
        
    row = property(fget= lambda self: self._row, fset = setRow)

    
fields = Fields(dict(name=0, phone=1, address=2))
sql = "select %s, %s, %s from addressbook" %
(fields[0],fields[1],fields[2])
print sql
sql = "select %s from addressbook" % ",
".join((str(fields['name']),str(fields['phone'])))	#needs str()
because type(fields['name'])==Field not str
print sql
sql = "select %s, %s from addressbook" % (fields['name'].name,
fields['phone'].name)
print sql
#r = cursor.execute(sql)
#rows = r.fetchall()
rows=(("jon","ext 391","jon address"),("bob","ext 294", "bob
address"))
for row in rows:
    fields.row=row
    print "by field name: name=%s\taddress=%s\tphone=%s" %
(fields['name'].value, fields['address'].value, fields['phone'].value)
    print "by field index: name=%s\taddress=%s\tphone=%s" %
(fields[0].value, fields[2].value, fields[1].value)
    print

=>
select name, phone, address from addressbook
select name, phone from addressbook
select name, phone from addressbook
by field name: name=jon  address=jon address     phone=ext 391
by field index: name=jon address=jon address     phone=ext 391

by field name: name=bob  address=bob address     phone=ext 294
by field index: name=bob address=bob address     phone=ext 294

Good Look



More information about the Python-list mailing list