martes, julio 27, 2010

Python ¿qué tiene 3 que no tenga 2?

Esta inquietud ha rondado por la cabeza de muchos desde que salió Python 3.0. En la lista de python-caracas Nhomar hace una pregunta simlar que se reduce a "Técnicamente, cuáles son las ventajas que traerá el python 3.X???". Más allá de los detalles menores como el hecho de que print ya no es una sentencia del lenguaje sino una función integrada, la inquietud real es saber ¿qué tiene Python 3 que no tenga Python 2?.

Luego de leer al respecto en varias fuentes, la respuesta que daré puede ser rara para algunos: nada. De echo, tiene menos. Quieren probarlo, solo les diré que es más fácil hacer que un código en Python 3 corra en Python 2 que lo contrario: puede verse a Python 3 como un subconjunto de Python 2.

No quiero escribir sobre lo nuevo de Python 3 (ya que pueden encontrar mucho material al respecto) sino de lo que he entendido fue la inspiración de Python 3.

Python 3 fue diseñado para honrar el principio "debe haber una-- y preferiblemente una --manera obvia de hacerlo" del Zen de Python[1].

Python 3 ha sido un intento por pulir aún más este lenguaje de pequeños detalles que sus creadores sentían incómodos y existían solo para mantener la compatibilidad hacia atrás del lenguaje. La solución fue eliminar esta compatibilidad. Parafraseando a Guido: "Es una oportunidad que él mismo se está dando para corregir esas decisiones de diseño equivocadas que tomó al principio del desarrollo de Python que no podría corregir sin romper el código de todos"[2].

Los cambios en la biblioteca dan testimonio de que se trata de una cuestión de honrar el sentido común en el diseño del lenguaje, pero sobre todo el Zen de Python referido. Por ejemplo:
  • Renombrar los módulos para que todos los nombres cumplan con la guía de estilo de Python (una sola forma de nombrar los módulos).
  • Eliminar la costumbre de tener dos nombres de módulos (uno de ellos con una c prefijada) si había una versión rápida implementada en C (un solo nombre de módulo).
  • Agrupar los módulos parecidos en un paquete común, por ejemplo, md5 y shasum ahora forman parte de hashlib (un solo punto de acceso para algoritmos similares).
La forma en que se trabaja con el texto es una evidente y clara forma de honrar el Zen. Ahora las cadenas son cadenas son cadenas y eso es todo (sí, énfasis redundando). Y si necesitas una manera de interactuar con los bytes que representan las cadena, tienes el tipo bytes y métodos para codificar una cadena en una secuencia tipo bytes. Todo está más claro ahora y bien separado.

Sin embargo, Python 3 trajo nuevos elementos al lenguaje, como la sentencia with, y la comprensión de conjuntos y diccionarios. Pero estos elementos han sido portados a Python 2 para hacer la transición a Python 3 más fácil.

[1] http://en.wikipedia.org/wiki/Python_3000#Version_3.0
[2] http://www.youtube.com/watch?v=s-fKcZ5pKLE#t=2m20s

Más enlaces sobre el tema:
http://www.b-list.org/weblog/2008/dec/05/python-3000/
http://diveintopython3.org/
http://www.ibm.com/developerworks/linux/library/l-python3-1/