Genéricos Integrados y de Colección
El Python moderno utiliza genéricos de colección integrados (list[int]) y tipos abstractos de collections.abc para describir contenedores con precisión, tanto para los lectores como para mypy/pyright.
Busca en todas las páginas de la documentación
El Python moderno utiliza genéricos de colección integrados (list[int]) y tipos abstractos de collections.abc para describir contenedores con precisión, tanto para los lectores como para mypy/pyright.
from collections.abc import Iterable, Mapping, Sequence
def total_lengths(names: Sequence[str]) -> int:
return sum(len(n) for n in names)
def merge(base: Mapping[str, int], extra: Mapping[str, int]) -> dict[str, int]:
return {**base, **extra}Cuándo usar esto:
dict de solo lectura sin mutaciónfrom collections.abc import Callable, Iterable, Iterator, Mapping
def index_by(items: Iterable[dict], key: str) -> dict[str, dict]:
result: dict[str, dict] = {}
for item in items:
result[str(item[key])] = item
return result
def batch(iterator: Iterator[int], size: int) -> Iterable[list[int]]:
batch_items: list[int] = []
for value in iterator:
batch_items.append(value)
if len(batch_items) == size:
yield batch_items
batch_items = []
if batch_items:
yield batch_items
def apply_all(fns: Mapping[str, Callable[[], None]]) -> None:
for fn in fns.values():
fn()
if __name__ == "__main__":
rows = [{"id": "1", "name": "Ada"}, {"id": "2", "name": "Linus"}]
print(index_by(rows, "id"))Lo que esto demuestra:
Iterable acepta listas, generadores e iteradores personalizadosIterator es de un solo paso; el verificador advierte si se reutiliza incorrectamente en modo estrictoMapping documenta diccionarios de solo lectura sin métodos de mutaciónCallable[[], None] tipa funciones de efectos secundarios sin argumentoslist[int]).list[Dog] no list[Animal]).isinstance en tiempo de ejecución y objetivos de tipado estructural.collections.abc en anotaciones (3.9+).dict[str, list[int]] para listas de adyacencia.| Aceptar | Cuándo |
|---|---|
Sequence | Se necesita indexación + len |
Iterable | Un solo pase hacia adelante |
Mapping | Búsqueda de claves de solo lectura |
MutableMapping | Necesita setitem/delitem |
# lista invariante - usar Sequence para parámetro de solo lectura
def print_all(items: Sequence[str]) -> None:
for item in items:
print(item)typing.List estilo obsoleto en 3.9+. Solución: list[int].Sequence.dict[str, int] no es compatible con dict[str, float] en varianza estricta. Solución: Usar unión de valores o Mapping.dict[str, Any] pierde seguridad. Solución: TypedDict o modelo Pydantic.tuple[int, ...] para longitud variable homogénea frente a tuple[int, str] fija.| Alternativa | Usar Cuándo | No Usar Cuándo |
|---|---|---|
TypedDict | Claves de cadena conocidas | Solo claves dinámicas |
| Modelo Pydantic | JSON anidado validado | Núcleo numérico interno |
TypeAlias | Alias anidado complejo | Lista simple list[int] |
numpy.ndarray | Tensores numéricos | Contenedores generales de Python |
Parámetro de tipo Sequence cuando solo lee/indexa; list cuando el llamador debe pasar específicamente una lista mutable.
Iterable produce un iterador a través de iter(). Iterator se agota después de un pase.
Mapping indica una API de solo lectura; dict cuando la función muta o devuelve un dict concreto.
set[str] para conjuntos homogéneos - invariante como list.
frozenset[str] igual que set para propósitos de tipado.
Iterator[T] o Iterable[T] - Iterator tiene semántica de un solo pase más estricta.
bytes para binario; memoryview raramente en APIs públicas - usar tipos del protocolo Buffer en tipado avanzado.
dict[str, object] es laxo; TypedDict o modelos para seguridad real.
collections.abc.Callable es preferido en anotaciones 3.9+.
Sequence[T] - no hay append en el contrato de tipo, aunque la lista en tiempo de ejecución sigue siendo mutable.
Versiones de la Pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026