Python 3.7 estaba, hasta hace poco, en la versión denominada «candidate release», pero ya pasó a su estado de versión oficial 3.7. Desde luego que esto no ha sido un camino fácil. Pasar de la versión 2 a la 3 ha llevado tiempo y un sinfín de contratiempos. Pero quien siga usando versiones anteriores a la 3 debería de reconsiderarlo porque Python 3.7 ya es una versión madura. Y de alguna manera, el lenguaje está empezando a convertirse en un clásico.
Lo nuevo en la versión 3.7 empieza con las nuevas «data classes», las cuales son clases que permiten almacenar datos. Por ejemplo, en C se usa «struct» o en Pascal «record». Java ya está en proceso de tener estas «data classes» y Kotlin ya las tiene definitivamente. Las nuevas clases en Python es una manera de crear clases listas para usarse con datos. Simplemente se añade @dataclass frente a una definición de clase y entonces se listan todos los campos que se desean usar. Cada campo es un nombre de una variable seguido por una anotación de su tipo. El sistema (decorator) convierte esto en una definición de clases con su correspondiente init de manera que el programador pueda inicializar correctamente los datos cuando se crea finalmente la instancia. Se puede modificar la manera en que los campos son creados usando la función de ayuda del «helper». Lo que es impresionante es que este tipo de datos se implementó usando solamente Python.
Con respecto a las anotaciones de tipos, la versión 3.7 añade referencias hacia adelante «forward» y mejora la velocidad de la operación. Y aunque tiene algunas dificultades, por ejemplo, cuando se describe la firma de una función, ésta se puede hacer mucho más compleja muy pronto, la idea puede ser funcional. Tendrá que ponerse más en práctica para ver la bondad de esta idea.
Otra característica nueva es la capacidad de trabajar con atributos definidos en módulos. Ahora se puede usar getattr__and__dir en los módulos. Esto, lógicamente, hace que los módulos se vean como clases «más grandes», lo cual es realmente así. Por otra parte, se ha incrementado la precisión del paquete de rutinas que manejan el tiempo. Por ejemplo, se pueden usar las funciones del módulo de tiempo para ganar precisión hasta nanosegundos, que regresan como si fuesen enteros.
Hay otras mejoras, que no son espectaculares, pero que se ven importantes:
- El orden del Diccionario se especifica ahora como parte del lenguaje y los iteratores trabajan en el orden en el que los objetos se han añadido.
- «async» y «wait» son palabras reservadas que si se usan como variables con esos nombres, le causarán problemas seguramente.
- Se ha mejorado el módulo «aysncio».
- Nuevas variables de contexto proveen almacenamiento de los threads locales para las tareas asíncronas.
- Un nuevo API de C para el almacenamiento de los threads locales.
Finalmente, esta nueva versión mejora la velocidad de llamado a la biblioteca estándar. Las llamadas a los métodos son más rápidas y el startup es más rápido también.