Vous êtes sur la page 1sur 6

Pasar de Perl a Python

Tcnicas para migrar de Perl a Python legacy no probado

Noah Gift 21-01-2011


Founder
GiftCS, LLC

Convertir legacy Perl en Python puede ser una tarea desalentadora. En este artculo puede aprender algo
sobre la teora relacionada con el cdigo legacy, incluyendo lo que no se debe hacer.

Voy a comenzar citando a Damian Conway en Perl Best Practices: "El enfoque de Perl "orientado a los
objetos" es casi excesivamente Perlish: hay demasiadas maneras de hacerlo... Existen tantas combinaciones
de implementacin, estructura y semntica posibles que es muy raro encontrar dos jerarquas de clases no
relacionadas que utilicen exactamente el mismo estilo de Perl OO".

Esta flexibilidad inherente al diseo del lenguaje Perl sin duda ha provocado la acumulacin orgnica del
cdigo de Perl que todava es tcnicamente frgil para cambiar y difcil de comprender. Para agravar el
problema existe la posibilidad de que los desarrolladores originales ya no estn ms disponibles habiendo
pasado a otros proyectos o compaas. Adems de la carga del cdigo legacy, los requisitos de la produccin
pueden haber cambiado o los nuevos vendedores de APIs estn nicamente disponibles en Python. En este
punto es donde comienza la monumental hazaa de pasar de Perl a Python.

Una vez que haya tomado esa decisin, necesita elegir la mejor estrategia para resolver el problema. Si usted
tiene la suerte de tener una base de cdigos de Perl lo suficientemente bien escrita y orientada a los objetos,
con una cobertura de prueba completa, entonces esto podra ser tan simple como convertir las pruebas de las
unidades de Perl a Python y luego hacer que el cdigo de Python apropiado pase las pruebas de las unidades
de Python recientemente transferidas. Aunque hay muchos programadores de Perl talentosos que escriben
cdigos bien documentados y legibles, estas personas no son tan comunes como deberan serlo. Lo ms
probable es que usted se encuentre en una situacin en la que no tenga la menor idea de cmo funciona
exactamente el cdigo de Perl, que no sea tan slo observarlo. Aqu es realmente en donde comienza la parte
ms compleja de pasar de Perl a Python.

Copyright IBM Corporation 2011 Marcas


Pasar de Perl a Python Pagina 1 de 6
developerWorks ibm.com/developerWorks/ssa/

Qu no se debe hacer: Llamar al cdigo de Perl desde el nuevo cdigo de


Python
Automatizar la generacin de prueba en Python
Los programadores de Python no deberan ser demasiado engredos. Mientras que muchas personas
estn de acuerdo con que Python est diseado de tal manera que lo convierte en un lenguaje de fcil
comprensin, todava pueden existir problemas tambin con el cdigo de Python legacy no probado.
Despus de todo, Python no se prueba a s mismo...o s?

Una manera posible de lidiar con el problema de Pynthon legacy no probado es utilizar la herramienta
de generacin de pruebas Pythoscope. La misin de Pythoscope es "Crear una herramienta de fuente
abierta que sea fcil de adaptar y ampliar que generar en forma automtica, o semiautomtica, las
pruebas de las unidades para los sistemas legacy escritos en Python". Adems, usted puede definir los
puntos de entrada que en forma automtica prueben las funciones basadas en su ejecucin. Consulte la
seccin Resources para obtener un ejemplo detallado de cmo funciona esto.

Antes de profundizar en la forma adecuada de hacer las cosas, primero vamos a explorar lo que no debemos
hacer. Es relativo a la naturaleza humana elegir el camino con menor resistencia cuando nos enfrentamos
con un desafo. Convertir una dcada de crecimiento empresarial y no probado del cdigo Perl en Python
es un problema difcil, por lo tanto la solucin ms obvia parece ser encontrar un camino alrededor de la
reescritura del cdigo de Perl. Esta lnea de pensamiento lo llevar luego a un mdulo llamado perlmodule,
que permite incorporar un intrprete Perl a Python. Entonces podra parecer simple llamar al anterior cdigo
de Perl desde el nuevo Python y hacerlo con l.

No es una buena idea, porque ahora usted tiene un problema an mayor que cuando comenz! Usted posee
un cdigo legacy que no comprende y tiene un nuevo cdigo que llama a un cdigo que no comprende. Esto
es como hacer un pago nico con una tarjeta de crdito utilizando un anticipo en efectivo con otra tarjeta
de crditolo nico que logra es retrasar lo inevitable e incrementa su deuda tcnica (vea Resources para
obtener ms informacin relacionada con la deuda tcnica). Para empeorar las cosas, usted habr "infectado"
su nuevo cdigo al incorporar errores sutiles que son difciles o imposibles de probar. Por ltimo, los nuevos
desarrolladores que se incorporen al proyecto ms adelante tendrn que trabajar con una base de cdigos que
sea una mezcla no aconsejable entre el Perl no probado y el Python insuficientemente probado.

Cdigo legacy de prueba funcional con nose para crear nuevas


especificaciones
En el libro Working Effectively With Legacy Code, el autor, Michael Feathers, dice, "Una de las cosas que
casi todos notan cuando se trata de escribir pruebas para un cdigo existente es lo poco adecuado que este
cdigo es para la prueba". Lo ms probable es que usted note lo mismo cuando piense por primera vez en
convertir el Perl legacy no probado a Python.

Un paso psicolgico y tcnico importante puede ser crear una prueba funcional que capture con precisin el
resultado final del cdigo de Perl que est intentando convertir. Por ejemplo, si usted est convirtiendo un
script de Perl que analiza un archivo de registro de gran tamao y genera un informe de valores separado por
comas podra escribir una prueba simple, defectuosa y funcional para controlar qu ocurre realmente en el
nuevo cdigo que est escribiendo.

Pasar de Perl a Python Pagina 2 de 6


ibm.com/developerWorks/ssa/ developerWorks

Para seguir adelante con el siguiente ejemplo, necesitar instalar nose. Si ya tiene instalada la herramienta
Python easy_install, slo tiene que emitir el comando easy_install nose. De no ser as, puede instalar setuptools
en primer lugar siguiendo las setuptools installation instructions.

Superado este inconveniente, aqu hay una prueba del ejemplo de nose:

Listado 1. Prueba funcional de nose con errores cometidos intencionalmente


#!/usr/bin/env python
"""First pass at porting Perl to Python"""

import os

def test_script_exists():
"""This test intentionally fails"""
assert os.path.exists("myreport.csv")

Si usted contina y realmente ejecuta esta prueba, debera tener este aspecto:

Listado 2. Resultados de la prueba


linux% /usr/local/bin/nosetests F
linux% /usr/local/bin/nosetests
F
======================================================================
FAIL: test_failing_functional.test_script_exists
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/local/Python/2.5/site-packages/nose-0.10.4-py2.5.egg/nose/case.py",
line 182, in runTest
self.test(*self.arg)
File "/usr/home/ngift/tests/test_failing_functional.py", line 7, in test_script_exists
assert os.path.exists("myreport.csv")
AssertionError

----------------------------------------------------------------------
Ran 1 test in 0.037s

FAILED (failures=1)

Como puede ver en esta prueba con errores, la aseveracin fall porque nunca hicimos nada para crear este
archivo. Si bien esto en un comienzo puede parecer no tener ningn sentido, es un paso en el proceso de la
planificacin de tantas cosas como sea posible realizar en nuestro black back del cdigo legacy.

Una vez que las pruebas funcionales que han sido escritas cubran lo ms posible las especificaciones
funcionales del cdigo anterior, valdra la pena mirar para ver si usted puede identificar cualquier parte
modular, comprobable y bien escrita de Perl para crear las pruebas de las unidades defectuosas. Ms pruebas
de error podran ser escritas para esas partes del cdigo hasta que una especificacin razonable comience a
tomar forma.

El paso final, que en realidad es el ms complejo, es escribir a continuacin el cdigo de Python que pase
esas pruebas que usted cre. Desafortunadamente, no hay una solucin milagrosa. Pasar el cdigo legacy no
probado o a Perl o a cualquier otro idioma es simplemente difcil, pero escribir las pruebas con error podra
ser de gran ayuda, y son una estrategia razonable.

Pasar de Perl a Python Pagina 3 de 6


developerWorks ibm.com/developerWorks/ssa/

Conclusin
Permtanme terminar citando a Guido Van Rossum en su artculo "Strong Versus Weak Typing":
"Usted nunca podr eliminar todos los errores. Hacer que el cdigo sea ms fcil de leer y escribir, y
ms transparente al equipo de lectores humanos que revisarn los cdigos fuente puede ser mucho ms
valioso...."

Finalmente, la creacin de un cdigo legible y comprobable es una de las principales metas para convertir el
cdigo legacy en un nuevo lenguaje tal como Python, si se lo realiza de un modo simple. Abrazar este ideal
puede eliminar un poco el miedo y el dolor del proceso. Buena suerte!

Pasar de Perl a Python Pagina 4 de 6


ibm.com/developerWorks/ssa/ developerWorks

Recursos
Aprender

Para obtener detalles sobre tutorial completo de nose, lea An Extended Introduction to the nose Unit
Testing Framework.
Consulte el Nose testing site para obtener las ltimas actualizaciones acerca de nose.
Lea "Strong Versus Weak Typing" para conocer ms detalles sobre las percepciones de Guido van
Rossum sobre la escritura.
Consulte CPAN para obtener ms informacin sobre el mdulo perlmodule.
El ingreso en Technical debt en Wikipedia le brinda un poco de informacin sobre este trmino que
describe el costo de la arquitectura slapdash y de las decisiones sobre el desarrollo.
Libros que se han escrito sobre Working Effectively with Legacy Code.
El sitio Pythoscope le brinda ms informacin sobre este generador til de pruebas de unidades para
Python.
Asegrese de leer el libro de Damian Conway, Perl Best Practices.
En la developerWorks Linux zone, encuentre cientos de artculos y tutorials how-to, as como tambin
downloads, foros y una gran cantidad de otros recursos para los desarrolladores y administradores de
Linux.
Mantngase al da con los eventos y los webcasts tcnicos de developerWorks que se centran en una
variedad de productos IBM y en temas de la industria IT.
Asista a una sesin informativa gratuita de developerWorks Live! para ponerse al tanto rpidamente
de los productos y de las herramientas IBM, as como tambin de las tendencias de la industria de IT.
Vea las developerWorks on-demand demos que abarcan desde las demostraciones para principiantes
sobre la instalacin y la configuracin hasta la funcionalidad avanzada para los desarrolladores con
experiencia.
Siga developerWorks on Twitter o suscrbase a un feed de Linux tweets on developerWorks.

Obtener los productos y tecnologas

Eval los productos IBM del modo que mejor se adecue a usted: Descargue una prueba del producto,
pruebe un producto en lnea, utilice un producto en un entorno en nube o dedquele unas pocas horas a
SOA Sandbox aprendiendo cmo implementar eficientemente la Service Oriented Architecture.

Comentar

Involcrese en la My developerWorks community. Conctese con otros usuarios de developerWorks


mientras explora los blogs, foros, grupos y wikis basados en los desarrolladores.

Pasar de Perl a Python Pagina 5 de 6


developerWorks ibm.com/developerWorks/ssa/

Sobre el autor
Noah Gift

Noah Gift es co-autor de Python For UNIX and Linux System Administration de O'Reilly,
y tambin trabaja en Google App Engine In Action para Manning. Es autor, conferencista,
consultor y lder comunitario, y escribe para publicaciones tales como Red Hat Magazine,
O'Reilly, y MacTech. El sito de la Web de su compaa consultora es http://www.giftcs.com,
y muchos de sus escritos los podr encontrar en http://noahgift.com. Usted tambin podr
seguir a Noah en Twitter. Tiene un doctorado en CIS de Los ngeles, Estado de California
y una licenciatura en Ciencias Nutricionales de Cal Poly San Luis Obispo. Es administrador
certificado de los sistemas Apple y LPI, y ha trabajado en empresas tales como Caltech,
Disney Feature Animation, Sony Imageworks, Turner Studios y Weta Digital. Le gusta pasar
su tiempo libre con su esposa, Leah, y su hijo, Liam, componer temas para piano, correr
maratones y entrenar religiosamente.

Copyright IBM Corporation 2011


(www.ibm.com/legal/copytrade.shtml)
Marcas
(www.ibm.com/developerworks/ssa/ibm/trademarks/)

Pasar de Perl a Python Pagina 6 de 6

Vous aimerez peut-être aussi