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贸nprint()
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="")
imprimeHay <4294967296> posibilidades!
(no usar espacio como separador)
-
Strings
Python 3.0 usa clases
str
(strings unicode) ybytes
(datos binarios), en vez deunicode
ystr
(strings de 8-bits)Se elimina
basestring
, ya que se unific贸 enstr
Literales para datos binarios, ej.
b"abc"
, crea una instancia debytes
En los archivos de texto, se obliga a usar una codificaci贸n (encoding)
Se elimina
string.letters
y similares (string.lowercase
ystring.uppercase
). Usarstring.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()
yfilter()
devuelven iteradores. Un ajuste r谩pido ser铆a por ej.list(map(...))
, pero algo mejor es usar comprehensi贸n de listas (especialmente si se usalambda
).builtin.sorted()
ylist.sort()
no aceptan un argumento cmpSe elimina
__getslice__()
y similaresxrange()
se renombra arange()
.next()
se renombra a__next__()
, se incorpora un nuevo builtinnext()
para llamara al m茅todo__next__()
Unpacking extendido de iterables. Ahora se puede escribir
a, b, *rest = some_sequence
-
Diccionarios:
dict.keys()
,dict.items()
ydict.values()
devuelven vistas en vez de listas (objetos que reflejan el contenido del diccionario). Por ejemplo, esto no funcionar谩:k = d.keys(); k.sort()
. Usark = sorted(d)
en su lugar.Se eliminan
dict.iterkeys()
,dict.itervalues()
ydict.iteritems()
(ver anterior)Se elimina
dict.has_key()
, usar operadorin
en su lugar. Ej.'x' in dict.keys()
en vez dedict.has_key('x')
-
Enteros:
1/2
devuelve un float (la divisi贸n entera devuelve un float). Usar1//2
para obtener el resultado truncado (entero)long
se renombra aint
(se unifican los enteros)Se remueve
sys.maxint
. Usarsys.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 deraise Exception, args
Se elimina el comportamiento de sequencias (slicing!) y el atributo
message
de las instanciasCaputra de excepciones: nueva sintaxis
except clases as instancia
en vez deexcept 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茅ricasDecoradores 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)): ....
usardef foo(a, b_c): b, c = b_c
-
Varios
Se elimina la comilla invertida (usar
repr()
)as
ywith
son palabras reservadas (keywords)True
,False
, andNone
son palabras reservadas (keywords)raw_input()
se renombra ainput()
, para el comportamiento anterior deinput()
, usareval(input())
Literales octales, binarios,
oct()
ybin()
. En vez de0666
, escribir0o666
. 脥dem binariosSe elimina:
apply()
,callable()
,coerce()
,execfile()
,file()
,reduce()
,reload()
exec()
is ahora una function.Nuevo representacion de formato punto flotante libre.
repr(11./5)
devuelve2.2
en vez de2.2000000000000002
Se eliminan
__oct__()
and__hex__()
.oct()
yhex()
usan__index__()
Se elimina soporte para
__members__
and__methods__
-
M贸dulos
Se elimina el m贸dulo
cPickle
. Usarpickle
en su lugar. Eventualmente existir谩 un modulo acelerador transparente.Se eliminan los m贸dulos
StringIO
ycStringIO
. En su lugar, importario.StringIO
oio.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
, yxmllib
Se elimina el m贸dulo
new
Se elimina functiones
os.tmpnam()
,os.tempnam()
yos.tmpfile()
en favor del m贸dulotempfile
驴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:
Portar el proyecto a Python 2.6.
Activar el modo de advertencia de Py3k
Testear y editar hasta que no queden advertencias
Usar la herramienta 2to3 para convertir el c贸digo fuente a la sint谩xis 3.0. No editar manualmente la salida de este programa!
Probar el c贸digo fuente convertido bajo Python 3.0
Si se encuentran problemas, hacer las correcciones en el c贸digo fuente de la versi贸n 2.6 y volver al paso 3
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)