[Python-es] trabajo con ciclos y arreglos

Chema Cortes pych3m4 en gmail.com
Jue Mayo 24 20:27:17 CEST 2012


El día 24 de mayo de 2012 17:41, Aldo Martinez Selleras
<aldo en caonao.cu> escribió:
> estoy trabajando en parsear un archivo .ini con el modulo ConfigParser, y
> todo lo hace super el modulo, pero tengo una inquietud, que se me traba el
> paraguas, a ver si me pueden dar una luz de como resolver el tema, el codigo
> es basicamente este

Primeramente, un consejo de estilo: cuando se puede intenta encadenar
expresiones lógicas en lugar de anidar 'ifs'. Por ejemplo:

  if len(conf.options(sect)) > 0:
     if not conf.get(sect,'tp') == 'Default':
        if not conf.has_option(sect,"c1"):

pasaría a

  if len(conf.options(sect)) > 0 and not conf.get(sect,'tp') ==
'Default' and not conf.has_option(sect,"c1"):

Aún más, podrías juntar el 'else' con el siguiente 'if' y quedar
todavía más compacto:

  elif len(conf.options(sect)) > 0 and not conf.get(sect,'tp') ==
'Default and not conf.has_option(sect,"c1"):


Por otro lado, en el código estás usando variables intermedias que no
usas luego. Voy a suponer que es un código sin perfilar del todo. Tal
como está se puede eliminar muchas líneas que no sirven de nada (y que
nos habría ayudado a nosotros a saber qué querías).

Entrando en lo que hace el código, no parece una buena elección usar
una lista (que no arreglo) para meter todos los datos que vas sacando.
Acabas teniendo una lista plana difícil de manejar (y creo que es lo
que vienes a preguntar).

Te aconsejo meter los datos en un diccionario para cada usuario, y
tener una lista de diccionarios. Un trozo de código sería así:

  usuario = {}

  if conf.has_option(sect,'checkavl'):
       usuario["phone"] = conf.get(sect,'checkavl')

 usuarios.append(usuario))

Aunque existe un modo más directo para llenar esta lista:

  usuarios=[dict(sect.items()) for sect in sections]


Por dejar un código similar al tuyo, aquí te pongo como lo haría yo:

mapping=(
    ("quota","timequota"),
    ("status","fg"),
    ("email","email"),
    ("last","timeusedlastupdated"),
    ("lastpw","passwordlastupdated"),
    ('phone','checkavl'),
    ('timeused','timeused'),
    ('tp','tp'),
)

for sect in sections:
    items=dict(sect.items(sect))

    if "IsTemplate" in items:
        plantillas.append(items)
    elif "c1" not in items and items.get("tp",None)!='Default':
        usuario=dict((a,items[b]) for (a,b) in mapping if b in items)
        usuarios.append(usuario)



-- 
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales


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