Una experiencia en PythonBugDay
Hoy se llevó a cabo el octavo Python Bug Day. Sabía que era en estos días pero no lo tenía presente ni se me había ocurrido participar. Al mediodía Facundo Batista me lo recuerda por chat y me pregunto... ¿Por qué no? Puedo probar unas horas, ver que pasa, nunca compilé Python tal vez tenga que hacerlo para probar una solución.
Me dieron una lista de bugs fáciles. Y elejí este: 1779. El bug en particular podría haber sido resuelto en pocos minutos por un desaarrollador de Python. Es más, el mismo había sido reportado por el creador del lenguaje :D Pero como bien dice en uno de los comentarios, es un buen bug para el Python Bug Day. A un experto, resolverlo no le habría costado nada, pero tampoco le habría aportado nada. A un novato como a mi me sirvió para conocer algo del nucleo del lenguaje y el proceso que hay que seguir para resolver un bug:
<li>Bajar la última versión del código fuente</li> <li>Compilar</li> <li>Correr los tests para ver que todo ande bien</li> <li> Encontrar el bug y arreglarlo</li> <li>Correr los tests nuevamente</li> <li>Arreglar los tests que fallan</li> <li>Agregar tests que prueben el arreglo</li> <li>Correr los tests nuevamente</li> <li>Armar un parche</li> <li>Envair el parche</li>
El bug, que continuará en las versiones previas de Python pero ya está corregido en Python 3000, es el siguiente:
>>> int("- 1")
-1
>>> float("- 1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): - 1
Cuando se quiere crear un número a partir de un string, no pueden haber espacios en blanco entre el signo (+ o -) y el número. El comportamiento correcto es el de la función float
. El de int
es errorneo. Necesita ser arreglado.
Obtener el código fuente
Bajé del servidor svn la última versión de Python 3000, la nueva versión del lenguaje, para el cual el bug estaba abierto:
svn co http://svn.python.org/projects/python/branches/py3k/
(Esto llevó bastante tiempo. Mientras tanto cociné y almorcé.)
Compilar
cd py3k/
./configure && make
Correr el intérprete compilado
./python
Correr los tests
make test
o
./python Lib/test/regrtest.py
Arreglar el bug
En los comentarios sel bug se decía que era simple de resolver y que no consistía más que en comentar 2 líneas en un archivo en C.
Revisé el archivo Objects/longobject.c
y luego de entender como funcionaba la función PyLong_FromString(char str, char *pend, int base)
, comenté las líneas 1688 y 1689. Problema resuelto!
Compilé para que mis cambios se vean reflejados.
make
Y probé en el intérprete.
>>> int("- 1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '- 1'
Perfecto!
Luego corrí las pruebas afectadas por mi cambio y fallaron.
./python Lib/test/test_builtin.py
La función en particular era test_int(self)
. Luego de una mirada rápida, comenté los valores de una lista que hacían fallar la prueba y pensé que con eso era suficiente. Consulté y me dijeron que también agregue mi cambio en Misc/NEWS. Lo hice. Lo siguiente era generar el parche.
svn diff | tee bug_fix_for_1779.diff
El mismo está en http://bugs.python.org/file9220.
Luego lo vio Facundo y me dijo que tenía que tenía que agregar pruebas para mi parche. Me llevó bastante tiempo entender como funcionaba la prueba. Finalmente, luego de preguntar bastante conseguí el resultado deseado. Volví a generar un parche y a subirlo.
svn diff | tee bug_fix_for_1779-plustests.diff
http://bugs.python.org/file9228
La experiencia
La verdad es que la experiencia fue muy buena. En unas 5 horas aprendí mucho sobre Python en si y sobre su ciclo de desarrollo, interactué con una comunidad despuesta a darte una mano cuando la necesitás y arreglé un error en el lenguaje que más uso. Voilá! Muchas gracias Comunidad de Python por organizar este Python Bug Day.