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

    Estructura de código y XML para canonicalización con Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    ElementTree canonicalize: normaliza XML en Python

    Aprende ElementTree canonicalize en Python para comparar XML, generar hashes estables y controlar namespaces, espacios y comentarios.

    Ler mais

    Tempo de leitura: 5 minutos
    22/10/2026
    Código Python en una pantalla
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    T-strings y templatelib: interpolación estructurada

    Aprende t-strings y string.templatelib en Python para interpolación estructurada, renderizado seguro, logs y procesamiento personalizado.

    Ler mais

    Tempo de leitura: 6 minutos
    22/10/2026
    Base SQLite y código Python para exportación selectiva con iterdump
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    SQLite iterdump: crea dumps selectivos en Python

    Aprende sqlite3.Connection.iterdump con filtro para crear dumps SQLite selectivos, validar dependencias y restaurar con seguridad.

    Ler mais

    Tempo de leitura: 4 minutos
    21/10/2026
    Código y archivos que representan compresión de datos con Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    compression.zstd: Zstandard rápido en Python

    Aprende compression.zstd en Python para comprimir archivos y datos con velocidad, streaming, integridad y seguridad.

    Ler mais

    Tempo de leitura: 7 minutos
    21/10/2026
    Archivo de configuración y estructura de código para ConfigParser en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    ConfigParser: lee INI sin sección en Python

    Aprende ConfigParser sin sección en Python con validación, tipos, compatibilidad, capas de configuración y escritura segura.

    Ler mais

    Tempo de leitura: 5 minutos
    20/10/2026
    Datos binarios y memoria de ordenador representando memoryview en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    memoryview count e index: busca sin copiar

    Aprende memoryview count e index en Python para buscar valores en buffers sin copias y validar datos binarios con eficiencia.

    Ler mais

    Tempo de leitura: 5 minutos
    20/10/2026