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

    Close-up view of a computer screen displaying code in a software development environment.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    DynamicClassAttribute: descriptors y acceso dinámico

    Entiende DynamicClassAttribute en Python, descriptors, acceso por clase e instancia, metaclases, Enum e introspección segura.

    Ler mais

    Tempo de leitura: 3 minutos
    30/08/2026
    Close-up of a laptop screen with code and a coffee mug, perfect for tech abstract themes.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    UserDict en Python: mappings personalizados

    Aprende UserDict en Python para crear mappings personalizados con validación, normalización, composición y mutaciones predecibles.

    Ler mais

    Tempo de leitura: 2 minutos
    30/08/2026
    Close-up of hands typing on a laptop keyboard, Python book in sight, coding in progress.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    itertools.accumulate: sumas y estados acumulados

    Aprende itertools.accumulate en Python para sumas, saldos, récords, transiciones de estado y pipelines lazy eficientes.

    Ler mais

    Tempo de leitura: 2 minutos
    30/08/2026
    A person reads 'Python for Unix and Linux System Administration' indoors.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    itertools.groupby: agrupa datos ordenados correctamente

    Aprende itertools.groupby en Python para datos ordenados, agregaciones streaming, subiteradores compartidos y agrupación correcta.

    Ler mais

    Tempo de leitura: 2 minutos
    30/08/2026
    A person in a hoodie coding on dual monitors, depicting cybersecurity and hacking themes.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    contextlib.chdir: riesgos al cambiar directorios

    Aprende contextlib.chdir en Python, sus riesgos con estado global y concurrencia y cuándo usar pathlib o subprocess cwd.

    Ler mais

    Tempo de leitura: 3 minutos
    30/08/2026
    A person typing on a laptop with a Python programming book visible, capturing technology and learning.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    nullcontext en Python: contextos opcionales

    Usa nullcontext en Python para unificar archivos, locks, transacciones, sesiones y recursos prestados sin duplicar ramas.

    Ler mais

    Tempo de leitura: 4 minutos
    30/08/2026