correccion de un programa!!!

Chema Cortés ch3m4 en ch3m4.org
Lun Mayo 24 04:01:03 CEST 2004


Mensaje citado por Ariel Nardelli <pan_python en yahoo.com.ar>:

> Bueno hice ya mi primer programa en python que es algo mas o menos
> usable :) y me gustaria que lo miren y me corrigan y me marquen errores
> o me cuenten alguna otra manera de hacer lo que hice...
> O sea, sean mis profesores :)

Yo te voy a dar algunas SUGERENCIAS, pero en absolutos deben ser consideradas
como "errores" de tu programa ("si funciona, no lo arregles").

Lo primero de todo, lo más visible de tú código, es que utilizas demasiado
indiscriminadamente la encapsulación en funciones. El separar código de la
secuencia principal para llavarlo a una función debería ser o porque es un
código que se repite mucho, o porque permite estructurar el programa en partes
"funcionales" que lo clarifiquen. Las funciones de tu código no cumplen con
estos criterios y sería mejor tener menos funciones y que el código fuera más
lineal (reconozco que es una cuestión de gusto personal).

Otra cosa, las excepciones deben utilizarse para recuperarse de un error, y no
tan sólo para informar. Si no se va a controlar el error, es más aconsejable
propagar el error "hacia arriba" en la pila de llamadas por si otro manejador
de excepciones lo quiere controlar. En tu código, enmascaras enmascaras el
error dando valores ficticios, lo que haría, de ser el código más largo, que no
supieras exactamente dónde se estaba produciendo el error. Mi recomendación es
que saques el bloque try..except de las funciones y lo pongas donde se pueda
controlar los errores, o sea, en el flujo principal. Por ejemplo:

def abrepg():
    # Conecta a la base pgsql
    db = pg.DB('nar','192.168.0.1')
    return db

try:
   db=abrepg()
except:
   print "ERROR: no tengo conexión"
   ori.close()
   sys.exit(1)


Otra cosa más estética (solemos hablar de ello como más "pytónico") son los
tratamiento de las cadenas que haces.

Por ejemplo:

  nrotel = str(k[2]) + " " + str(k[3]) + " " + str(k[4])

lo vemos más elegante hacerlo así (de menos a más "pytónico"):

  " ".join(str(k[2]),str(k[3]),str(k[4]))
  " ".join([str(s) for s in k[2:5]])
  " ".join([str(s) for s in k[2:5] if s>0])

Éste último evitaría el problema de que salgan ceros cuando no hay teléfonos.
Otra variante, con control de formateo:

  "%5d %5d %5d" % (k[2],k[3],k[4])
  "%5d %5d %5d" % k[2:5]


Hay algunas mejoras posibles. Se podría ser más explícito poniendo nombres a los
campos:

    for codigo,nombre,tel1,tel2,tel3 in ori:
        print codigo,nombre,tel1,tel2,tel3

        nrotel = str(tel1) + " " + str(tel2]) + " " + str(tel3])


Ó se podría construir la sentencia de una atacada:

     sql = "insert into destinos values ('%02d','%s','%5d %5d %5d','3560');"
     db.query(sql%k)


Pero es más bien una regla de estilo que una recomendación. No sabría decirte
cuál es mejor. Deberás ser tú el que elija su propio estilo.


Saludos,
Chema




Más información sobre la lista de distribución Python-es