Me apunto todas vuestras sugerencias y espero que la próxima vez mi
consulta no sea tan caótica. Al final por ahora me limito a ser un
usuario de python del "The Python Tutorial" y desconozco muchas cosas.
Me apunto los unittest. Gracias,

El día 9 de septiembre de 2010 15:07, lasizoillo
<lasizoi...@gmail.com> escribió:
> El día 8 de septiembre de 2010 20:13, Christian Pinedo Zamalloa
> <chr.pin...@gmail.com> escribió:
>> Hola,
>>
>> llevo más de 2 horas con un problema en Python que no consigo
>> solucionar y lo que es peor no consigo ver donde se encuentra el
>> problema. Explico el problema.
>>
>> Dentro del bucle for, en una lista de diccionarios compruebo si está
>> un diccionario que tengan una key de nombre id con un valor
>> determinado. Si se encuentra se copia el diccionario y se elimina de
>> la lista. Posteriormente este diccionario es copiado a otro
>> diccionario y sobre este nuevo diccionario se aplican cambios. Pues
>> bien al aplicarse cambios en unas keys se pierden los valores de la
>> copia...
>
> ¿En que te basas para decir eso? ¿Qué valor tiene calls[i] en "DENTRO
> DEL BUCLE"?
>
> Con los datos que das se podría pensar que el diccionario viene mal de antes.
>
>> Creo que puede ser un problema con la eliminación del
>> diccionario de la lista o las copias de diccionarios que hago....
>
> La copia es muy mejorable como te han indicado. Y parece que tu
> diccionario es plano y no vas a necesitar "deep copy". Pero si lo que
> guardas con objetos inmutables (y tiene toda la pinta) no deberia
> haber problemas en tu modo de copia.
>
> Si miras las trazas verás lo descabellado que es pensar que el
> problema está en la eliminación del diccionario de la lista.
>
>> pero
>> he intentado mil cosas y no he conseguido nada.
>>
>
> Si con trazas no avanzas cambia de estrategia. Igual usar el debugger
> es lo suyo.
>
>> Pego el código y el resultado de las pruebas. Gracias!!
>>
>> CODIGO
>> =======
>>
>>  51     # comprobar si hay un id idéntico en la lista de llamadas
>>  52     for i in range(len(calls)):
>>  53         if calls[i]['id'] == id:
>>  54             if calls[i]['event'] == "ENTERQUEUE" or\
>>  55                calls[i]['event'] == "CONNECT":
>>  56                 print "DENTRO DEL BUCLE"
>>  57                 print "oldcall1"
>>  58                 for key in keys:
>>  59                     oldcall[key] = calls[i][key]
>>  60                 print oldcall
>>  61                 calls.pop(i)
>>  62                 break
>>  63             else:
>>  64                 print >> sys.stderr, "Error: Se va a sobreescribir
>> un evento\
>>  65                 no considerado en el script %s" % call['event']
>>  66                 sys.exit(1)
>>  67     if oldcall:
>>  68         print "oldcall2"
>>  69         print oldcall
>>  70         for key in keys:
>>  71             newcall[key] = oldcall[key]
>>  72         print "newcall1"
>>  73         print newcall
>> ......
>>  81     elif event == "CONNECT":
>>  82         newcall['event'] = line.split('|')[4]
>>  83         newcall['agent'] = line.split('|')[3].split('@')[0].split('/')[1]
>>  84         newcall['waittime'] = line.split('|')[5]
>>
>>
>> DEBUG
>> =======
>>
>> DENTRO DEL BUCLE
>> oldcall1
>> {'waittime': '', 'callerid': '', 'calltime': '', 'agent': '', 'event':
>> 'ENTERQUEUE', 'queue': '17810', 'inposition': '', 'outposition': '',
>> 'date': '1283941447', 'id': '1283941434.31503'}
>> oldcall2
>> {'waittime': '', 'callerid': '', 'calltime': '', 'agent': '', 'event':
>> 'ENTERQUEUE', 'queue': '17810', 'inposition': '', 'outposition': '',
>> 'date': '1283941447', 'id': '1283941434.31503'}
>> newcall1
>> {'waittime': '', 'callerid': '', 'calltime': '', 'agent': '', 'event':
>> 'ENTERQUEUE', 'queue': '17810', 'inposition': '', 'outposition': '',
>> 'date': '1283941447', 'id': '1283941434.31503'}
>> newcall2
>> {'waittime': '119', 'callerid': '', 'calltime': '', 'agent': '17816',
>> 'event': 'CONNECT', 'queue': '', 'inposition': '', 'outposition': '',
>> 'date': '', 'id': ''}
>>
>
> newcall2 aparece mágicamente. ¿De qué sirven trazas que no se
> corresponden con el código?
>
> Esto no es una bronca, es un pretexto para sacar el tema de las
> pruebas unitarias. La forma profesional de ponerle trazas a tu código
> que trae otro montón de ventajas añadidas ;-)
>
> Algunas ventajas:
>  * El código de la función que falla y su test unitario es genial para
> ayudarte en la lista
>  * Ayuda a encontrar muchos errores sin necesidad de que te los
> informe un usuario del programa.
>  * Cuando encuentras un error, haces la prueba que lo reproduce y
> luego garantizas que no lo vuelves a cometer.
>  * Automatizas las pruebas. Hacer 700 pruebas manualmente es inhumano,
> con test unitarios los puede hacer la máquina mientras duermes. Ayuda
> a que puedas tocar el código sin romper cosas.
>  * Pueden servir de base para test de carga o de cobertura (por poner
> algún ejemplo).
>
> Si he logrado "vendertelos" puede echarle un ojo a:
> http://docs.python.org/library/unittest.html
>
> Un saludo:
>
> Javi
> _______________________________________________
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>



-- 
Christian Pinedo Zamalloa (zako)
PGP keyID: 0x828D0C80
Fingerprint: 7BFF 4105 F46B 7977 BD96  348C 1007 4FF8 828D 0C80
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a