domingo, 8 de diciembre de 2013

Python 2.x o Python 3.x? ¿qué versión debo utilizar?



¿Python 2.x o Python 3.x ?
¿Cuáles son las diferencias?
¿Qué versión debería utilizar?
Existen dos grandes ramas de versiones de Python, las versiones 2.x y las versiones 3.x (más recientes). La última version 2.x fue la 2.7 de 2010, contando con soporte hasta el final de su vida útil. Y ya no contara con cambios importantes.
La versión 3.x está bajo desarrollo activo desde 2010, con 3 años de versiones estables a la fecha, incluyendo la Python 3.3.3 en 2013. Por lo que las mejoras a bibliotecas estándar recientes sólo están disponibles en Python 3.x. (Ver la versión mas reciente en News).

¿Y por qué existen estas dos grandes ramas en Python?
Guido van Rossum (creador del lenguaje Python) decidió mejorar drasticamente Python 2.x, con énfasis en mejor soporte Unicode (con todas las cadenas con texto Unicode por defecto), así como una separación bytes/Unicode mas coherente.

Esto tubo un coste, las mejoras de Python 3.x conllevan una menor compatibilidad hacia versiones previas (gama 2.x). Además , varios aspectos base del lenguaje (como las declaraciones "print" y "exec") se han ajustado para ser más fáciles para los novatos y ser más coherentes con el resto del lenguaje, eliminando el resto de cosas, por ejemplo, todas las clases son ahora de nuevo estilo "range()" mejorando la eficiencia en memoria comparado con Python 2.x.
El documento all "What's new" documents  proporciona una buena visión global de los principales cambios en el lenguaje y las probables fuentes de incompatibilidad con el código de Python 2.x existente.
El mayor problema surge del software Python de muy buena calidad, creado en los últimos años. Al romper la compatibilidad hacia atrás en 3.x, mucho de este software (incluido el interno de empresas) aún no funciona en 3.x todavía. Portarlo de 2.x a 3.x lleva tiempo y hay que pulirlo.
Entonces, ¿Qué versión debería utilizar?
La versión que se debe utilizar dependerá principalmente de lo que se quiera hacer. Si eres capaz de hacer exactamente lo que quieres con Python 3.x, ¡excelente!
 
Hay unos cuantos inconvenientes menores, como un soporte de bibliotecas ligeramente menor y el hecho de que la mayoría de las distribuciones de Linux y Mac actuales siguen utilizando Python 2.x como defecto, pero el lenguaje Python 3.x esta lo suficientemente maduro y disponible. (ver página de Descargas de Python).
Si está disponible Python 3.x en el equipo y se escribe código que no requiera de módulos ya no soportados por Python 3.x, no debería haber problema alguno.
En el caso de Linux, la mayoría de las distribuciones de Linux ya tienen Python 3.x instalado, y es accesible a los usuarios finales.
Para los Sistemas Operativos en general, la tendencia es a la eliminación de Python 2 como default, de forma gradual. Sin embargo, hay algunas cuestiones clave que pueden requerir el uso de Python 2 en vez de Python 3:
1. Si se implementa o despliega a un entorno que no es controlado, esto puede imponer una versión específica, impidiendo la selección libre de las versiones disponibles.
2. Si se desea utilizar un paquete específico (de un tercero) o alguna utilidad que aún no cuenta con una versión comercial que sea compatible con Python 3, y que portar ese paquete no sea una tarea sencilla, utilizar Python 2 conservara el acceso a ese paquete.
Un ejemplo son los módulos populares que aún no admite Python 3, como "Twisted" (para creación de redes y demás aplicaciones) o "gevent". La mayoría de bibliotecas como estas, tienen personas trabajando en el soporte a 3.x, siendo un trabajo en curso en diversas fases. Es más prioritario para ciertas bibliotecas que otras: por ejemplo "Twisted", se centra principalmente en los servidores de producción, donde el apoyo a las versiones anteriores de Python es importante, y mucho menos el apoyo a una nueva versión que incluye importantes cambios en el lenguaje.
"Twisted" es un excelente ejemplo de un importante paquete, donde la migración a Python 3.x está lejos de ser trivial. Para la creación de aplicaciones con GUI de Python 3, ya vienen con "Tkinker" , que ya cuenta con soporte por PyQt casi desde el día en que Python 3 fue lanzado ; PySide añadió soporte Python 3 en 2011. GTK + GUI se pueden crear con PyGObject que soporta Python 3 y es el sucesor de PyGtk . Muchos otros paquetes principales han sido portados a Python 3, incluyendo:
  • numpy(para análisis numérico)
  • Django, Flask, CherryPy y Pyramid (para sitios web)
  • PIL (un módulo de procesamiento de la imagen).
  • cx_Freeze (para empaquetar aplicaciones y sus dependencias)
  • py2exe (empaquetar la aplicación para usuarios de Windows)
Deseas utilizar Python 3.x, pero ¿tienes miedo a causa de una dependencia?, vale la pena investigar primero!
Este es un trabajo en progreso y la página wiki puede ser antigua. Incluso, aún si la documentación oficial y el tutorial estan actualizados para Python 3, hay una gran cantidad de documentación (incluyendo ejemplos) en la Web y en los libros de referencia que aún utilizan Python 2.

Aunque esto esta mejorando actualmente, digamos que aún la documentación esta en esa fase de migración de Python 2 a Python 3 y hay que tenerlo en cuenta, ya que puede requerir algunos ajustes para que todo funcione bien con Python 3. (Andaos con cuidado pero si, tarde que temprano esto se solucionara).

Vale la pena señalar que si se desea utilizar una implementación alternativa de Python como IronPythonJython o PyPy (o uno de la lista de la plataforma Python o implementaciones más amplias del compilador), el soporte para Python 3 sigue siendo relativamente poco frecuente. Esto afectaría en la elección por razones de integración con otros sistemas o por el rendimiento.
¿Entonces debería o no debería evitar la versión 2.x?
Python 2.x es un lenguaje antiguo con muchos errores, y se necesito una versión principal para sacarlos. Sin embargo, algunas de las mejoras menos dramáticas en Python 3.0 y 3.1 se han portado a Python 2.6 y 2.7​​, respectivamente. Para más detalles ver What's New in Python 2.6 y What's New in Python 2.7. Una lista (no muy exhaustiva) de características que sólo están disponibles en las versiones 3.x y que no serán portadas a la serie 2.x, es:
  • Las "strings" son Unicode de forma predeterminada
  • Separación limpia Unicode/bytes
  • Excepción de encadenamiento
  • Anotaciones de función
  • Sintaxis para la palabra clave - sólo argumentos
  • Desembalaje tupla extendido
  • Declaraciones de variables no locales
Además, la evolución del lenguaje no se limita a los cambios sintácticos o semánticos clave. También se refiere a la biblioteca estándar, llevando a cabo muchas mejoras en Python 3 que no serán portadas a Python 2. (Ver What's New in Python 3).
Dicho esto, el código 2.x bien escrito puede ser muy parecido al código 3.x. Eso puede significar muchas cosas, incluyendo el uso de nuevo estilo de clases, el desuso de incantaciones anticuadas, utilizar "iteradores" que aunque estan disponibles son lentos, etc.
Un ejemplo práctico: un buen código 2.x normalmente utiliza "xrange" en lugar de "rango". "xrange" fue el punto de partida para la gama Python 3.x (aunque rango es incluso mejor en Python 3, ya que puede manejar los valores más grandes que sys.maxint). Cabe señalar que "xrange ( )" no está incluido en Python 3.
Por encima de todo, lo recomendable es centrarse en escribir buen código para que 2.x vs 3.x no se convierta en un problema. Eso incluye la escritura completa de suites prueba, y conseguir un buen Unicode.
Python 3.x es mucho menos tolerante que 2.x sobre Unicode frente a cuestiones de bytes: esto se considera algo bueno, aunque para ello se deban portar algunos paquetes de software (lo cual es bastante molesto).
Quiero usar Python 3, pero hay esta pequeña biblioteca que quiero usar de Python 2.x. ¿Realmente tengo que volver a usar Python 2 o renunciar a usar esa biblioteca?
Suponiendo que no se encuentre un paquete alternativo que este soportado por Python, todavía habría que considerar algunas opciones: Portar la biblioteca a 3.x. ("Portar" significa hacer trabajar la biblioteca en Python 3.x). Si esto resulta ser muy difícil, y todas las otras dependencias existen en 2.x, considere comenzar con Python 2.x.
El código bien escrito en 2.x normalmente permite hacer el cambio "sin dolor", tan pronto como cada dependencia haya sido portada con éxito. Hay que decidir si la función es realmente tan importante. ¿Quizás podría omitirse?. La situación ideal es que se trate de portar la librería a 3.x. A menudo se puede encontrar a alguien que ya está trabajando en esto. Incluso cuando ese no sea el caso, los miembros del proyecto suelen apreciar la ayuda, sobre todo por que al portar, se encuentran a menudo errores en el software original, mejorando la calidad de el original y el portado a 3.x . "Portar" no siempre es fácil, pero por lo general es más fácil que escribir código desde cero.
¿Cómo se supone que se debe hacer la portabilidad?
Bueno, esto se explica en el PEP 3000. Básicamente es tomar la versión 2.x de la biblioteca y utilizar el convertidor 2to3 automatizado para crear una versión compatible con Python 3 y comprobar que todas las pruebas por unidad, siguen pasando.
Si las pruebas fallan, habrá que modificar las fuentes originales 2.x y volver a intentarlo. Este enfoque permite desarrollar en paralelo 2.x y 3.x desde una única base de código 2.x. Esto es mucho más fácil que tratar de mantener 2.x y 3.x como ramas independientes (ya que esto ha mantenido a los desarrolladores del núcleo de Python atrapados desde hace 3 años).
La portabilidad es más complicada si hay módulos de extensión C involucrados, pero aún así, todavía es probable que sea más fácil que inventar un paquete equivalente propio.
También hay más guías que abordan este aspecto en profundidad:
Me decidí a escribir algo en 3.x pero ahora alguien quiere utilizarlo  y sólo tiene 2.x. ¿Qué hago?
Además de la herramienta de 2to3 que permite que el código 3.x que se genere a partir de código fuente 2.x , también existe la herramienta de 3to2 , cuyo objetivo es convertir el código 3.x de nuevo a código 2.x . En teoría , esto debería funcionar incluso mejor que ir en la otra dirección, ya que 3.x no tiene mayor número de casos desagradables para el convertidor (deshacerse de la mayor cantidad posible de ellos, fue una de las principales razones para romper compatibilidad con versiones anteriores, después de todo!). Sin embargo, es importante saber que si el código hace uso intensivo de 3.x, es poco probable que se convierta con éxito (sobretodo por funciones de anotación).
También es justo decir que 3to2 es el camino menos transitado en comparación con 2to3 en esta etapa, por lo que podría venir con algunos problemillas aquí y allá. Sin embargo, si desea escribir código 3.x , es definitivamente una ideaque  vale la pena "explorar" .
six es otra herramienta.
Otros recursos que pueden ayudar a hacer la elección entre Python 2 y Python 3
Fuente:
Este blog se basa en la edición anglosajona original de LachlanDufty, la podéis encontrar en la página oficial de Python en la discusión Python 2 or 3?. Se ha procurado mantener la integridad referencial, así como aquellos enlaces de importancia.
Si queréis aprender el lenguaje Python, es recomendable hacer la suscripción en la página oficial y explorar un poco el contenido ahí expuesto. Ahí podéis encontrar todo lo que necesitéis.
El creador de Python fue reclutado por Google en años anteriores, y aunque ahora mismo trabaja para Dropbox, como legado, Google ha puesto a disposición de los usuarios un curso bastante concreto para aprender Python, en cual podéis mirar en Python Course, esta en un nivel de ingles aceptable y os lo recomiendo.
Python es una buena opción si tienes interés en lenguajes de programación, es sencillo y te permitirá mejorar tareas básicas, así como comprender de una manera "limpia" el arte de programar. Muchas herramientas están desarrolladas en este lenguaje, además contamos con código abierto, que nos permite conocer en gran medida ejemplos bastante completos de lo que se puede llegar a programar, uno de los mayores ejemplos es Linux, donde podréis tener acceso a infinidad de programas y su correspondiente código fuente de libre acceso.

Espero hayáis disfrutado de la lectura. Si queréis profundizar en algún tema, ponerlo en los comentarios