Python 3.0 es la 煤ltima versi贸n del lenguaje, actualmente en desarrollo. Se pueden ver todas las caracter铆sticas en el PEP 3000 y derivados.

驴Python 3.0 no es compatible hacia atras con versiones previas?

S铆, del mismo PEP se lee que "Python 3000 romper谩 la compatibilidad hacia atr谩s", pero esto no es tan grave como parece, las modificaciones son menores y tienen mucho menos impacto que los cambios que suceden en otros lenguajes (como por ej. en VB 6.0 a VB.NET como caso extremo, pero tambien en menor medida como sucedi贸 con PHP 5, Perl 6, Java 2, .NET 2.0, etc.)

Por ello, no hay motivo para alarmarse, dejar de usar python o firmar peticiones como pas贸 con Visual Basic Classic (6.0). La transici贸n, en la mayor铆a de los casos, va a ser transparente o con cambios m铆nimos, sin tener que reescribir todo el c贸digo (ver m谩s abajo).

Lo que es conveniente es escribir el nuevo c贸digo (a煤n en Python 2.4 o Python 2.5) teniendo en cuenta las modificaciones de Python 3.0, para evitar complicaciones futuras y facilitar la transici贸n autom谩tica.

驴Que cambia en Py3K?

Se puede encontrar la lista de cambios en "Whats New 3.0". En general, son correcciones de desambiguedades y comportamientos duplicados, unificaciones, limpieza de cosas obsoletas y algunas mejoras. A continuaci贸n se resumen, agrupados por "afinidad", en un orden arbitrario (el impacto de cada uno depender谩 de como uno use el lenguaje):

  • La instrucci贸n print se reemplaza con una funci贸n print()

    • Viejo: print "La respuesta es", 2*2 Nuevo: print("La respuesta es", 2*2)

    • Viejo: print x, Nuevo: print(x, end=" ") (no saltar a la pr贸xima linea)

    • Viejo: print Nuevo: print() (imprimir una l铆nea en blanco)

    • Viejo: print >>sys.stderr, "fatal error" Nuevo: print("fatal error", file=sys.stderr)

    • Viejo: print (x, y) Nuevo: print((x, y)) (llamar con una tupla como primer par谩metro)

    • Nuevo: print("Hay <", 2**32, "> posibilidades!", sep="") imprime Hay <4294967296> posibilidades! (no usar espacio como separador)

  • Strings

    • Python 3.0 usa clases str (strings unicode) y bytes (datos binarios), en vez de unicode y str (strings de 8-bits)

    • Se elimina basestring, ya que se unific贸 en str

    • Literales para datos binarios, ej. b"abc", crea una instancia de bytes

    • En los archivos de texto, se obliga a usar una codificaci贸n (encoding)

    • Se elimina string.letters y similares (string.lowercase y string.uppercase). Usar string.ascii_letters

    • UTF-8 es la codificaci贸n del c贸digo fuente por defecto. Se agrega la posibilidad de tener identificadores con "letras" no ASCII.

    • Nuevo esquema para el formateo de strings: "hola {quien}".format(quien="mundo") (se mantiene el % estilo C)

  • Iterables

    • zip(), map() y filter() devuelven iteradores. Un ajuste r谩pido ser铆a por ej. list(map(...)), pero algo mejor es usar comprehensi贸n de listas (especialmente si se usa lambda).

    • builtin.sorted() y list.sort() no aceptan un argumento cmp

    • Se elimina __getslice__() y similares

    • xrange() se renombra a range()

    • .next() se renombra a __next__(), se incorpora un nuevo builtin next() para llamara al m茅todo __next__()

    • Unpacking extendido de iterables. Ahora se puede escribir a, b, *rest = some_sequence

  • Diccionarios:

    • dict.keys(), dict.items() y dict.values() devuelven vistas en vez de listas (objetos que reflejan el contenido del diccionario). Por ejemplo, esto no funcionar谩: k = d.keys(); k.sort(). Usar k = sorted(d) en su lugar.

    • Se eliminan dict.iterkeys(), dict.itervalues() y dict.iteritems() (ver anterior)

    • Se elimina dict.has_key(), usar operador in en su lugar. Ej. 'x' in dict.keys() en vez de dict.has_key('x')

  • Enteros:

    • 1/2 devuelve un float (la divisi贸n entera devuelve un float). Usar 1//2 para obtener el resultado truncado (entero)

    • long se renombra a int (se unifican los enteros)

    • Se remueve sys.maxint. Usar sys.maxsize

    • La repr() de un entero largo no incluye el prefijo L

  • Excepciones:

    • Deben derivar de BaseException

    • Se elimina StandardError

    • Se deben lanzar con un raise Exception(args) en vez de raise Exception, args

    • Se elimina el comportamiento de sequencias (slicing!) y el atributo message de las instancias

    • Caputra de excepciones: nueva sintaxis except clases as instancia en vez de except clases, instancia. La instancia se libera al finalizar el bloque.

    • Encadenado de excepciones (nuevos atributos)

    • Mejoras en los mensajes de error en windows

  • Clases y Metaclases

    • Se remueven las clases "clasicas"

    • Se incorpora una nueva sintaxis de metaclases

    • Abstract Base Classes (ABCs); decoradores @abstractmethod and @abstractproperty; ABCs colecciones y num茅ricas

    • Decoradores de Clases

    • Nuevo super(). Se puede invocar sin argumentos y la clase correcta ser谩 elegida

  • Comparaciones

    • Se elimina <> (usar !=)

    • != devuelve lo opuesto de ==, salvo que == devuelva NotImplemented.

    • Los operadores de ordenamiento se comportan diferentes cuando se compara tipos incompatibles (lanza excepci贸n)

  • Funciones, argumentos y valores devueltos

    • Se estandariza las anotaciones de los par谩metros y resultados de las funciones: def dividir(a: int, b: int) -> float:. Como anotaci贸n se puede usar cualquier expresi贸n arbitraria: def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):

    • Argumentos Keyword-only. Se debe incluir el nombre del argumento despues del *arg

    • Instrucci贸n nonlocal (para usar variables de ambitos exteriores pero no globales)

    • Se elimina el unpacking tuplas en parametros. En vez de def foo(a, (b, c)): .... usar def foo(a, b_c): b, c = b_c

  • Varios

    • Se elimina la comilla invertida (usar repr())

    • as y with son palabras reservadas (keywords)

    • True, False, and None son palabras reservadas (keywords)

    • raw_input() se renombra a input(), para el comportamiento anterior de input(), usar eval(input())

    • Literales octales, binarios, oct() y bin(). En vez de 0666, escribir 0o666. 脥dem binarios

    • Se elimina: apply(), callable(), coerce(), execfile(), file(), reduce(), reload()

    • exec() is ahora una function.

    • Nuevo representacion de formato punto flotante libre. repr(11./5) devuelve 2.2 en vez de 2.2000000000000002

    • Se eliminan __oct__() and __hex__(). oct() y hex() usan __index__()

    • Se elimina soporte para __members__ and __methods__

  • M贸dulos

    • Se elimina el m贸dulo cPickle. Usar pickle en su lugar. Eventualmente existir谩 un modulo acelerador transparente.

    • Se eliminan los m贸dulos StringIO y cStringIO. En su lugar, importar io.StringIO o io.BytesIO (ver arriba)

    • Se elimina el m贸dulo imageop

    • Se eliminan los m贸dulos audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing, y xmllib

    • Se elimina el m贸dulo new

    • Se elimina functiones os.tmpnam(), os.tempnam() y os.tmpfile() en favor del m贸dulo tempfile

驴Como hacer la transici贸n a Py3K?

Para facilitar la transici贸n, Python 2.6 soportar谩 compatibilidad hacia adelante:

  • "Modo de Advertencia Py3k", el cual advertir谩 dinamicamente (en tiempo de ejecuci贸n) sobre las caracter铆sticas que dejaran de funcionar en Python 3.0.

  • Contener谩 versiones "backportadas" de las nuevas caracteristicas de Py3K, tanto activadas con __future__ o permitiendo usar la sintaxis nueva o vieja.

Adicionalmente, y en vez de implementar todas las nuevas caracter铆sticas en Python 2.6, existe una herramienta de conversi贸n de c贸digo fuente (2to3), que ayudar谩 a la traducci贸n autom谩tica del c贸digo fuente.

Suponiendo que se tengan test de unidades con cobertura aproximadamente completa, el modo recomendado de desarrollo para proyectos que deban soportar tanto Python 2.6 como 3.0 ser铆a:

  1. Portar el proyecto a Python 2.6.

  2. Activar el modo de advertencia de Py3k

  3. Testear y editar hasta que no queden advertencias

  4. Usar la herramienta 2to3 para convertir el c贸digo fuente a la sint谩xis 3.0. No editar manualmente la salida de este programa!

  5. Probar el c贸digo fuente convertido bajo Python 3.0

  6. Si se encuentran problemas, hacer las correcciones en el c贸digo fuente de la versi贸n 2.6 y volver al paso 3

  7. Al momento de publicar, publicar versiones separadas del proyecto sobre 2.6 y 3.0

驴Es necesario esperar a Python 3.0 para comenzar nuevos proyectos?

Pregunta:

> Ahora que estoy leyendo veo que python 3 no es compatible con la versi贸n 2 y hay algunos cambios en la sintaxis. No ser铆a conveniente arrancar con la sintaxis 3 directamente (si bien leo por ah铆 que esta en versi贸n alfa todav铆a).

Respuesta

No, Python 3.0 es s贸lo para que el resto del mundo empiece a ponerse a tiro.

Estamos planeando liberar 3.0 final tipo por agosto (el "tipo por" es para asombro de Bob), y es para afirmar APIs y conceptos... la realidad es que Python 3 va a ser tan usable como Python 2 en la versi贸n 3.1.

Asi que, a menos que quieras entrar en producci贸n dentro de dos a帽os, larg谩 con Py2 tranquilo.

Para un ejemplo, elijamos una biblioteca de terceros bien conocida: PIL, que es para tratamiento de im谩genes. Como Python 3 cambia un mont贸n de cosas, el "viejo PIL" no funciona, y tienen que adaptarlo para el nuevo Python.

Entonces, cuando larguemos Py3.0, estamos consolidando las bases y diciendo: "Ok, PIL, esta es la API, fijate y adaptate". Entonces, durante unos meses la gente de PIL se adpata a lo nuevo, y cuando sale Py3.1, vos ya ten茅s PIL.

Pero en 3.0 no lo ten茅s. Por eso digo que 3.0 no es para producci贸n, sino para que el resto del mundo (PIL y otras bibliotecas) se pongan a tiro.

(Respuesta de FacundoBatista tomada de la Lista)