Python 3.15: UTF-8 Por Fin Es el Encoding Por Defecto en Todas Partes
Publicado el 9 de octubre, Python 3.15 hace UTF-8 el encoding por defecto incluso en Windows, junto a lazy imports, frozendict y un JIT más rápido.
La noticia más silenciosa de Python 3.15 es la que más te afecta
Python 3.15.0 se publicó el 9 de octubre, y los titulares fueron para lo llamativo: lazy imports, frozendict, JIT mejorado, el profiler Tachyon. Pero el cambio que menos .py va a romper y más UnicodeDecodeError va a evitar es el PEP 686: open() usa UTF-8 por defecto aunque tu sistema diga cp1252.
Por qué esto importaba tanto
Hasta ahora, el encoding por defecto de open() dependía del locale del sistema operativo:
- En Linux/macOS: casi siempre UTF-8. Todo bien.
- En Windows:
cp1252(o peor,cp850en consolas). Todo mal.
El resultado era un clásico: el script que generaba un archivo en Windows se leía en el servidor Linux y producía UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9. La respuesta canónica era poner encoding='utf-8' en cada open(), lo cual todo el mundo hacía... cuando se acordaba.
Con PEP 686, ese boilerplate deja de ser necesario: UTF-8 es el default en todas las plataformas. Los archivos se escriben igual en Windows que en Linux. Los mojibake causados por locale desaparecen como categoría de bug.
El resto de novedades, en rápido
- Lazy imports (PEP 810):
lazy import numpydifiere la carga del módulo hasta que realmente lo usas. Mejora medida de cold start: hasta un 50% en aplicaciones con imports pesados. frozendict(PEP 814): diccionario inmutable y hasheable, utilizable como clave de dict o miembro de set.sentinel(PEP 661): sentinels con nombre legible que sobreviven arepr(), acabando con la clase de losobject()anónimos.- JIT 7-12% más rápido en benchmarks, y
pdb.attach()para depurar procesos remotos en caliente.
Qué revisar antes de migrar
- Código que dependía del locale: si alguna parte de tu sistema asumía cp1252 (tests que escriben ficheros, parsers de archivos legacy), ahora escribirás/leerás UTF-8 aunque el entorno diga otra cosa. Revisa tests que comparen bytes.
open(path)explícito donde antes poníasencoding='utf-8': puedes quitarlo, aunque dejarlo no molesta.- Pipeline Windows → producción: si tu flujo implicaba scripts en Windows generando datos, ahora los archivos serán consistentemente UTF-8 — verifica que lo que los consume espera eso (seguramente sí).
Y cuando te toque depurar un mojibake —porque seguirá habiendo sistemas antiguos— recuerda que puedes inspeccionar esos bytes extraños con nuestro decodificador URL para ver los %XX reales o el decodificador Base64 para payloads encodificados.
Python 3.15 no reinventa nada: simplemente pone por defecto lo que el 95% del código ya asumía que era el default. Los bugs de encoding no desaparecen, pero al menos dejan de aparecer en el caso más común de todos.
관련 기사
El Gusano Shai-Hulud Sigue Vivo en npm: Qué Credenciales Rotar y en Qué Orden
tensorlake@0.5.144 es la última variante del gusano que roba tokens de npm, GitHub y tu .env antes de republicarse con tu identidad. Checklist práctico si instalaste paquetes afectados.
OAuth 2.1 Ya Jubila Oficialmente a RFC 6749: Estas Son las Reglas Nuevas
El draft-16 de OAuth 2.1, publicado en septiembre, declara obsoletos RFC 6749 y 6750: PKCE para todos, adiós al implicit grant. Y el nuevo BCP de validación de JWT está a punto de ser RFC.
Temporal Ya Es Estándar: La API Que Por Fin Sustituye a Date
TC39 aprobó Temporal en Stage 4 y ya funciona sin flags en Chrome, Firefox y Node 26. Qué cambia para tus timestamps, zonas horarias y cálculos de fechas.