¿Cómo funciona vars() en Python? Explicación y ejemplos prácticos

La función integrada vars() en Python devuelve el diccionario de atributos (__dict__) de un objeto. Es una herramienta útil para inspeccionar el estado interno de instancias, clases o contextos de ejecución.

En este artículo, veremos ejemplos prácticos de uso, situaciones comunes y precauciones para evitar errores al usar vars().

Sintaxis de vars()

vars([obj])

obj (opcional): El objeto del que se quiere obtener el diccionario __dict__.
Si no se proporciona, vars() devuelve las variables locales del contexto actual.

Ejemplos prácticos

1. vars() con un objeto que tiene __dict__

class User:
    def __init__(self, name: str, role: str):
        self.name = name
        self.role = role

print(vars(User("Alice", "admin"))) # {'name': 'Alice', 'role': 'admin'}

Aquí, vars() devuelve el diccionario con las propiedades y valores internos de la instancia User.

2. vars() sin argumentos — contexto local

x = 42
y = "Python"

print(vars()) # {'x': 42, 'y': 'Python', ...}

En este caso, vars() devuelve el diccionario de variables locales.
Es equivalente a locals() en la práctica, aunque locals() tiene un comportamiento específico según la implementación de Python (por ejemplo, en CPython).

3. vars() con clases que usan __slots__

class WithoutDict:
    __slots__ = ['data']
    def __init__(self, data: int):
        self.data = data

vars(WithoutDict(5)) # TypeError: vars() argument must have __dict__ attribute

Si la clase define __slots__ sin incluir __dict__, no habrá diccionario de atributos y vars() lanzará TypeError.

Para que funcione, debes incluir explícitamente __dict__ en __slots__:

class WithDictInSlots:
    __slots__ = ['data', '__dict__']
    def __init__(self, data: int):
        self.data = data

print(vars(WithDictInSlots(5))) # {'data': 5}

Es por eso que antes de llamar a vars(), se recomienda compruebar si el objeto tiene un __dict__:

if hasattr(obj, '__dict__'):
    attrs = vars(obj)

Esto evita excepciones y mejora la robustez del código.

Conclusión

vars() es simple, directa y muy útil para depuración rápida e inspección de objetos en Python.
Sin embargo:

  • Comprueba que el objeto tenga __dict__.
  • Usa alternativas como dir() o inspect.getmembers() si necesitas información más completa.
  • Con __slots__ debes incluir explícitamente __dict__ si quieres compatibilidad con vars().