
Python 3.15.0 está disponible como versión estable desde el 9 de octubre de 2026. La actualización incorpora cambios visibles para quienes escriben programas, entre ellos las importaciones diferidas explícitas, el tipo inmutable `frozendict` y UTF-8 como codificación de texto predeterminada. Para un equipo que mantiene automatizaciones, herramientas de análisis o servicios, el interés no está únicamente en estrenar sintaxis: algunas novedades afectan al momento en que sucede el trabajo y a las suposiciones que un programa hace sobre sus archivos.
La nueva versión ofrece oportunidades distintas. Una herramienta de línea de comandos puede evitar cargar módulos que nunca llega a utilizar. Un archivo puede leerse de manera más consistente entre sistemas. Una configuración puede representarse con un contenedor que no admita modificaciones. Son cambios concretos, con consecuencias diferentes, que conviene evaluar dentro del flujo real de cada aplicación.
Cargar un módulo cuando se necesita
La expresión `lazy import` permite declarar una importación cuyo trabajo se aplaza hasta que se utiliza el nombre importado. Normalmente, importar un módulo implica localizarlo, leerlo y ejecutar su código de nivel superior. En una aplicación con muchas dependencias, parte de ese esfuerzo puede realizarse aunque la operación solicitada por el usuario nunca necesite esos componentes.
Pensemos en una utilidad con varias funciones: una consulta breve, una exportación y la elaboración de un gráfico. Si la consulta no necesita la biblioteca de gráficos, cargarla al arrancar añade un coste que esa ejecución no aprovecha. La importación diferida permite mantener la declaración organizada en el módulo y posponer la carga. El ejemplo describe el mecanismo, no una medición realizada sobre un producto concreto.
La documentación también admite `lazy from ... import ...`. En ambos casos, la primera utilización del nombre puede desencadenar la carga. Esto desplaza igualmente los errores: si falta un módulo o falla su inicialización, la excepción puede aparecer al usarlo en lugar de al arrancar. Por esa razón, una pantalla que se abre más deprisa no demuestra que todas las funciones de la aplicación estén listas para ejecutarse correctamente.
Hay restricciones sintácticas. La palabra `lazy` se utiliza en el ámbito del módulo, no dentro de una función, del cuerpo de una clase o de un bloque `try`. Tampoco permite convertir en diferidas las importaciones con asterisco ni las de `__future__`. Introducirla en un proyecto que debe seguir funcionando con versiones anteriores exige revisar su compatibilidad, porque esos intérpretes no entienden la nueva sintaxis.
También se aplazan los efectos de la inicialización
Importar puede hacer algo más que poner funciones a disposición del programa. Un módulo puede registrar componentes o preparar estado compartido durante su inicialización. Si se retrasa ese momento, también se retrasa ese efecto. El PEP 810, que describe el diseño, insiste en el control explícito de la carga y en los cambios observables de comportamiento que puede producir.
La consecuencia práctica es que elegir dónde aplicar la novedad requiere entender para qué se importa cada dependencia. Un módulo utilizado únicamente por una función ocasional es un candidato distinto de otro cuyo registro inicial necesita el resto del programa. Conviene medir tanto el arranque como la primera ejecución de la función afectada. Trasladar una espera puede mejorar la experiencia, pero no equivale automáticamente a eliminarla.
UTF-8 deja de depender de una suposición del entorno
Python 3.15 activa por defecto el modo UTF-8. Cuando una operación de texto no especifica una codificación, este cambio hace que UTF-8 sea la referencia predeterminada en los casos descritos por la documentación. Su objetivo es reducir diferencias entre entornos y facilitar la interoperabilidad con formatos y herramientas que ya emplean esa codificación.
Para un archivo con tildes, eñes o símbolos, acertar con la codificación es tan importante como encontrar la ruta correcta. Los bytes guardados necesitan una interpretación. Cambiar el valor predeterminado no transforma los documentos antiguos que se almacenaron con otra codificación. Si un archivo heredado depende de una página de códigos distinta, el programa sigue necesitando indicar cuál es.
La guía de novedades recomienda proporcionar explícitamente el argumento `encoding` para mejorar la compatibilidad entre versiones. También documenta `encoding='locale'` cuando se necesita la codificación del entorno. Existe la posibilidad de desactivar el modo UTF-8 mediante `PYTHONUTF8=0` o `-X utf8=0`, pero eso recupera un comportamiento anterior. No sustituye a identificar qué formato tienen realmente los datos que se están intercambiando.
Un diccionario que no permite cambiar sus entradas
La incorporación de `frozendict` añade un tipo integrado para representar un mapa inmutable. Conserva el orden de inserción y no permite modificar sus entradas después de crearlo. Puede ser útil para expresar que un conjunto de opciones debe permanecer estable durante una operación, en lugar de confiar únicamente en que nadie cambie un diccionario compartido.
Su condición de inmutable tiene un alcance preciso. El PEP 814 aclara que no congela recursivamente los valores que contiene. Si uno de esos valores es un objeto mutable, el contenido de ese objeto puede seguir cambiando. Además, `frozendict` no es una subclase de `dict`, por lo que un código que acepte exclusivamente ese tipo concreto puede necesitar adaptación. Es una herramienta para expresar una propiedad del contenedor, no una garantía universal sobre todos los objetos que cuelgan de él.
Antes de trasladar una aplicación a 3.15, el trabajo útil consiste en comprobar sus dependencias, sus archivos de entrada y las funciones que ejecuta de verdad. Una prueba de arranque cubre una parte del recorrido. Las operaciones menos frecuentes, las importaciones que producen registros y los textos heredados ayudan a descubrir diferencias que una ejecución breve podría dejar ocultas. La versión estable abre esa evaluación desde el 9 de octubre, sin convertir cada cambio disponible en una obligación de adoptarlo inmediatamente.