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()oinspect.getmembers()si necesitas información más completa. - Con
__slots__debes incluir explícitamente__dict__si quieres compatibilidad convars().