newbie evaluation

Ismael Herrera ismaelherreragasser at
Thu Sep 23 05:06:02 CEST 2004

Hi , i am new to python , and this is my first wanna-be program, it would
help me a lot if you point me my mistakes or bad design, bad practice or an
easier , faster ,cleaner or better way to program since dont want to stick
with bad practices.

The point of the mini program is to store the debian package database(wich
is in a file) in a list of objects instead of just text , for easy

Later i will transform it to xml then to database schema,to make advances
queries against the package manager,but thats later.(not in this app)

The database file is a serie of entries(packages) that looks like this:

Package: tcpd
Priority: important
Section: base
Installed-Size: 196
Maintainer: Anthony Towns <ajt at>
Architecture: i386
Source: tcp-wrappers
Version: 7.6.dbs-5
Replaces: libwrap0 (<< 7.6-8)
Depends: libc6 (>= 2.3.2.ds1-4), libwrap0 (>= 7.6-1.1), debconf (>= 0.5) |
Conflicts: netbase (<< 3.16-1)
Size: 71974
Description: Wietse Venema's TCP wrapper utilities
 Wietse Venema's network logger, also known as TCPD or LOG_TCP.
 These programs log the client host name of incoming telnet,
 ftp, rsh, rlogin, finger etc. requests. Security options are:
 access control per host, domain and/or service; detection of
 host name spoofing or host address spoofing; booby traps to
 implement an early-warning system.

each package is separated by a \n\n. 
Dont forget to copy/paste it in your text editor for easy reading   

import re
#each package in the file
class dpackage(object):
  PKG = 'Package'
  PRI = 'Priority'
  SEC = 'Section'
  INS = 'Installed-Size'
  MAI = 'Maintainer'
  ARQ = 'Architecture'
  VER = 'Version'
  DEP = 'Depends'
  REQ = 'Recommends'
  SIZ = 'Size' 
  DES = 'Description'

  def __init__(self):
    self.package = None
    self.priority = None
    self.section = None
    self.installedSize = None
    self.mainteiner = None 
    self.arquitecture = None
    self.version = None
    self.depends = []
    self.recoments = []
    self.size = None
    self.description = None
  def __str__(self):
    return '''
Package = %s
Priority = %s
Section = %s
Installed Size = %s
Mainteiner = %s
Arquitecture = %s
Version = %s
Depends = %s
Recoments = %s
Size = %s
Description = %s
    ''' % \
class dpackagedb(object):
  def _init__(self):

    self.db = []
  def load(self):
    try :
      #open the database file   
      f = open('/var/lib/dpkg/available','r')
    except : raise IOError
    #temporary list to store package entries
    tmpls ='\n\n') 
    #make package objects for each package
    self.db = map(self.makeobject,tmpls) 
    del self.db[len(self.db)-1]
  def makeobject(self,item):
    p = dpackage()
    entry = self._processitem(item)

    p.package = entry.get(dpackage.PKG)
    p.priority = entry.get(dpackage.PRI)
    p.section = entry.get(dpackage.SEC)
    p.installedSize = entry.get(dpackage.INS)
    p.mainteiner = entry.get(dpackage.MAI)
    p.arquitecture = entry.get(dpackage.ARQ)
    p.version = entry.get(dpackage.VER)
    p.depends = entry.get(dpackage.DEP) 
    p.recoments = entry.get(dpackage.REQ) 
    p.size = entry.get(dpackage.SIZ)
    p.description = entry.get(dpackage.DES)
    return p   

  def _processitem(self,item):

    result = []

    iter = re.finditer('.*\n',item) 
    for x in iter : 
      xstr =
      if xstr.startswith('Description'):
        # get from description to the end(exceptional case)
      else : 
        result.append(xstr.strip()) # normal field
    # get field : value pairs    
    result = dict([ item.split(':',1) for item in result])  
    # exceptional case
    recommends = result.get('Recommends')
    if recommends:result['Recommends'] = recommends.split(',')
    # exceptional case
    depends = result.get('Depends')
    if depends : result['Depends'] = depends.split(',')

    return result


#if __name__ is '__main__': 
d = dpackagedb() 
for x in d.db: 
  if x: 
    print x  
 #print d.db

More information about the Python-list mailing list