¿Qué hay de nuevo en Python 3.13?

_images/python-logo.png

Sobre mí Nekmo

_images/cara.svg

Programador Python

Charlas anteriores

_images/python311-logo.png _images/python312-logo.png

¿Qué hay de nuevo en Python 3.13?

Python Málaga + PyData Málaga

_images/python-malaga-logo.png _images/pydata-malaga-logo.png _images/plytix-logo-purple.svg

¿Más rápido?

Python 3.13 retrasado

_images/phoronix.png

https://www.phoronix.com/news/Python-3.13-rc3-Released

¿Cuánto más rápido es?

Muerte

Ahora sin GIL

GIL

Cediendo el control

_images/gil_lock_example.gif

Un solo núcleo

Python sin GIL

Pelea entre hilos

Python 3.13 sin GIL con hilos

Nuevo JIT experimental

Compilador Just-In-Time

Python 3.13 con JIT experimental

Mejoras en la línea de comandos

¡Colores!

Copiar y pegar más fácil

F2 Historial F3 Modo pegar

Modo ayuda

F1 Ayuda

help, exit y quit sin paréntesis

help exit quit

Mejoras en mensajes de error

Nombres de módulo ya en uso

$ python random.py
Traceback (most recent call last):
  File "/home/me/random.py", line 1, in <module>
    import random
  File "/home/me/random.py", line 3, in <module>
    print(random.randint(5))
          ^^^^^^^^^^^^^^
AttributeError: module 'random' has no attribute 'randint'
(consider renaming '/home/me/random.py' since it has the
 same name as the standard library module named 'random'
 and the import system gives it precedence)

Nombre de parámetro equivocado

>>> "Better error messages!".split(max_split=1)
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    "Better error messages!".split(max_split=1)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
TypeError: split() got an unexpected keyword argument
'max_split'. Did you mean 'maxsplit'?

Mejoras en typing

Regalos

PEP 696: Tipos por defecto en TypeVar, ParamSpec y TypeVarTuple

T = TypeVar("T", default=int)


@dataclass
class Box(Generic[T]):
    value: T | None = None


reveal_type(Box())                      # type is Box[int]
reveal_type(Box(value="Hello World!"))  # type is Box[str]

PEP 702: Decorador warnings.deprecated()

from warnings import deprecated


@deprecated("It is pining for the fiords")
def norwegian_blue(x: int) -> int: ...


@deprecated("Use Spam instead")
class Ham: ...


class Spam:
    @deprecated("There is enough spam in the world")
    def __add__(self, other: object) -> object: ...

PEP 705: Sólo lectura en TypedDict

from typing import NotRequired, ReadOnly, TypedDict


class Movie(TypedDict):
    name: ReadOnly[str]
    year: ReadOnly[NotRequired[int | None]]

PEP 742: TypeIs

from typing import TypeIs


def is_int(x: object) -> TypeIs[int]:
    return isinstance(x, int)

PEP 667: Mejoras en locals()

class C:
    x = 1
    sys._getframe().f_locals['x'] = 2
    print(x)  # Print 2


def f():
    x = 1
    sys._getframe().f_locals['x'] = 2
    print(x)  # Print 1


f()

Otros cambios

  • Nueva excepción PythonFinalizationError, si hay bloqueos durante finalización.

  • argparse ahora soporta marcar como obsoleto comandos, argumentos...

  • Soporte para codificación z85, usada por ZeroMQ o Git, en el módulo base64.

  • copy.replace() copia y reemplaza del objeto copiado.

  • El módulo random ahora incluye línea de comandos.

Eliminaciones

  • Eliminación de módulos muertos de stdlib: aifc, audioop, cgi, cgitb, chunk, crypt...

  • Eliminado 2to3 y lib2to3 (obsoleto desde 3.11).

  • Eliminado tkinter.tix (obsoleto desde 3.6).

  • Eliminada locale.resetlocale()

  • Eliminados typing.io y typing.re.

  • Eliminados los descriptores tipo __get__ y __set__ de @classmethod.

Aplausos módulos muertos y 2to3

Plataformas soportadas

  • PEP 730: iOS está oficialmente soportado (tier 3).

  • PEP 738: Android está oficialmente soportado (tier 3).

  • wasm32-wasi pasa a ser tier 2.

  • wasm32-emscripten ya no está oficialmente soportado.

Listado completo de cambios

https://docs.python.org/3/whatsnew/3.13.html

¿Cuál es vuestra mejora favorita?

¡Muchas gracias a todos!

PyData

_images/pydata-malaga-logo.png

Plytix

_images/plytix-logo-purple.svg

Pyzzas

_images/pizza.svg

Python Málaga

QR

_images/qr.svg

Contactar