Muchas de las características completamente nuevas que se introdujeron en 3.0 también se backported a 2.6, una elección deliberada. Sin embargo, esto no fue práctico en todos los casos, por lo que algunas de las características nuevas se mantuvieron en Python 3: solo.
Cómo funcionan las metaclases, es probablemente la característica nueva más grande. La sintaxis es claramente mejor que 2.*
's __metaclass__
tarea ...:
class X(abase, metaclass=Y):
pero lo más importante, la nueva sintaxis significa que el compilador sabe la metaclase a utilizar antes de procesar el cuerpo de la clase, por lo que la metaclase puede finalmente influir en la forma en que se procesa el cuerpo de la clase; esto no fue posible en 2.*
. Específicamente, el nuevo método __prepare__
de la metaclase puede devolver cualquier asignación grabable, y si es así, se usa en lugar de un dict
regular para registrar las asignaciones (y asignar palabras clave como def
) realizadas en el cuerpo de la clase. En particular, esto permite que el pedido del cuerpo de clase finalmente se conserve exactamente como está escrito, y también permite que la metaclase, si así lo desea, grabe múltiples asignaciones/definiciones para cualquier nombre en el cuerpo de clase, en lugar de solo la última asignación o definición realizada para ese nombre. Esto amplía enormemente la aplicabilidad de las clases con metaclases personalizadas apropiadas, en comparación con lo que era factible en 2.*
.
Otra sintaxis biggie es annotations - vea la PEP que estoy señalando para obtener más detalles. La biblioteca estándar de Python no ofrece semánticas especiales para las anotaciones, pero exactamente debido a que los marcos y herramientas de terceros están facultados para aplicar cualquier semántica que deseen, tareas tales como verificación de tipos para argumentos de funciones están permitidas, aunque no directamente por el biblioteca estándar de Python.
Por supuesto, hay muchos otros (el nuevo concepto de "puntos de vista" encarnada por métodos tales como dict de .keys
& C en 3.*
, palabra clave-únicos argumentos, mejor secuencia de desembalaje, nonlocal
para cierres más potentes, ...), de variando peso, pero todo bastante útil y bien diseñado.
¿cómo definiría la función * completamente nueva *? – SilentGhost
Acabo de agregar un poco, gracias por señalarlo. – Joe
Votación para cerrar como demasiado amplia. –