UserList en Python: secuencias personalizadas

Publicado el: 30/08/2026
Tempo de leitura: 2 minutos
Vibrant close-up of artistically decorated acoustic guitars with floral patterns.

collections.UserList es una clase auxiliar para crear secuencias mutables personalizadas. Guarda los elementos en una lista normal disponible mediante data y ofrece una superficie predecible para validación, normalización, logging y reglas de dominio.

Es útil cuando una colección debe comportarse como lista, pero necesita controlar inserciones, reemplazos, borrado, tipos aceptados u operaciones por lotes.

Ejemplo básico

from collections import UserList

class ListaEnteros(UserList):
    def _validar(self, valor):
        if not isinstance(valor, int):
            raise TypeError("solo enteros")
        return valor

    def append(self, valor):
        super().append(self._validar(valor))

    def insert(self, indice, valor):
        super().insert(indice, self._validar(valor))

Validar solo append no es suficiente. La lista también cambia mediante asignación por índice, slices, extend y +=.

Cubrir todas las mutaciones

class ListaEnteros(UserList):
    def _validar(self, valor):
        if not isinstance(valor, int):
            raise TypeError("solo enteros")
        return valor

    def __setitem__(self, indice, valor):
        if isinstance(indice, slice):
            valor = [self._validar(item) for item in valor]
        else:
            valor = self._validar(valor)
        super().__setitem__(indice, valor)

    def append(self, valor):
        super().append(self._validar(valor))

    def insert(self, indice, valor):
        super().insert(indice, self._validar(valor))

    def extend(self, valores):
        super().extend(self._validar(item) for item in valores)

El atributo data

data contiene la lista real. Modificarla directamente puede saltarse validaciones, por lo que conviene tratarla como un detalle interno.

Normalizar valores

class Etiquetas(UserList):
    def _normalizar(self, valor):
        texto = str(valor).strip().casefold()
        if not texto:
            raise ValueError("etiqueta vacía")
        return texto

Decide si se permiten duplicados. Si la unicidad es la regla principal, un set o mapping puede representar mejor el dominio.

UserList frente a heredar de list

Una subclase directa de list puede ser más rápida y necesaria cuando una API exige el tipo concreto. UserList prioriza extensibilidad y dirige las operaciones por métodos más sencillos de personalizar.

UserList frente a MutableSequence

Implementa MutableSequence cuando los datos no viven en una lista normal, por ejemplo una secuencia en disco, una ventana virtual o una estructura compacta. Usa UserList cuando una lista interna sea suficiente.

Operaciones que crean nuevas secuencias

Prueba concatenación, multiplicación, slicing y copia. Define si el resultado debe conservar la clase personalizada o convertirse en una lista normal.

Ordenación e instrumentación

class Tareas(UserList):
    def sort(self, *, key=None, reverse=False):
        registrar("ordenando tareas")
        super().sort(key=key, reverse=reverse)

Evita efectos secundarios costosos o sorprendentes en operaciones familiares.

Serialización

Algunos serializadores requieren una lista concreta. Convierte explícitamente:

import json
json.dumps(list(valores), ensure_ascii=False)

Errores comunes

  • Validar solo append.
  • Ignorar asignación por slice y extend.
  • Modificar data directamente.
  • Usar una lista cuando se necesita unicidad.
  • Suponer el tipo retornado por slicing o concatenación.

Buenas prácticas

Enumera todos los caminos de mutación, centraliza validación, usa super(), prueba operadores y documenta los tipos de retorno. Consulta las guías internas de listas en Python y collections.

Conclusión

UserList es una base práctica para secuencias personalizadas respaldadas por una lista común. Facilita invariantes coherentes sin depender de detalles internos de list.

Fuentes externas

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Código en una pantalla que representa t-strings en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    T-strings en Python 3.14: templates estructurados

    Aprende t-strings en Python 3.14, explora Template e Interpolation y crea renderizadores estructurados, extensibles y seguros.

    Ler mais

    Tempo de leitura: 6 minutos
    16/10/2026
    CPU y módulos de memoria que representan shared_memory track en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    shared_memory track: controla el resource tracker

    Aprende shared_memory track en Python para controlar el resource tracker, la propiedad y la limpieza entre procesos.

    Ler mais

    Tempo de leitura: 5 minutos
    16/10/2026
    Unidad de almacenamiento de datos que representa compression.zstd en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    compression.zstd: streaming y compresión segura

    Aprende compression.zstd en Python para comprimir archivos y datos con velocidad, streaming, diccionarios y límites seguros.

    Ler mais

    Tempo de leitura: 7 minutos
    15/10/2026
    Código en pantalla para diagnosticar procesos con sys.remote_exec en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    sys.remote_exec: diagnostica procesos Python

    Aprende sys.remote_exec en Python para diagnosticar procesos activos con scripts controlados, permisos seguros y buenas prácticas.

    Ler mais

    Tempo de leitura: 7 minutos
    15/10/2026
    Código Python y configuración de variables de entorno con os.reload_environ
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    os.reload_environ: threads y variables de entorno

    Aprende os.reload_environ en Python para actualizar variables de entorno externas con validación, compatibilidad y precauciones de concurrencia.

    Ler mais

    Tempo de leitura: 5 minutos
    14/10/2026
    Código Python que representa contextvars.Token y aislamiento de contexto asíncrono
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    contextvars.Token: restaura contexto async

    Aprende contextvars.Token en Python para valores temporales, restauración automática y aislamiento seguro entre tareas asíncronas.

    Ler mais

    Tempo de leitura: 7 minutos
    14/10/2026