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