Python / dir() / Explorar los nombres de atributos de un objeto
dir(object) de Python devuelve una lista de nombres de atributos como cadenas. No devuelve ni ejecuta directamente los métodos o valores. Los nombres están ordenados, pero el objeto puede personalizar la lista, por lo que no garantiza un inventario completo de todos los atributos accesibles.
El resultado contiene nombres, no métodos
Los atributos son datos o comportamientos asociados a un objeto; los métodos son comportamientos que se pueden llamar. En una cadena, upper es un nombre y text.upper() una llamada real. La referencia oficial de dir() describe su orientación a la exploración interactiva cómoda.
Los ejemplos completos solo necesitan Python 3. Guarda el código en UTF-8 como dir_example.py y ejecuta python dir_example.py, o python3 según el entorno. Cada ejemplo posterior puede sustituir el contenido del mismo archivo y funcionar de manera independiente.
text = "hello"
names = dir(text)
print(type(names).__name__)
print(all(isinstance(name, str) for name in names))
print("upper" in names)
print(names == sorted(names))
print(text.upper())
Resultado esperado:
list
True
True
True
HELLO
Todos los elementos son cadenas. Encontrar upper no convierte el texto: la última línea llama al método explícitamente. La lista completa puede variar entre versiones de Python; por eso el ejemplo comprueba un nombre relevante y no reproduce una lista fija.
Explorar módulos y listas de la misma forma
Un módulo contiene nombres de funciones, constantes y otros objetos. Después de localizar sqrt en dir(math), llámalo como math.sqrt(). Del mismo modo, encontrar append no cambia una lista hasta que lo llamas sobre ella.
import math
print("sqrt" in dir(math))
print(math.sqrt(9))
items = []
print("append" in dir(items))
items.append("a")
print(items)
True
3.0
True
['a']
Un nombre no explica argumentos ni valores devueltos. Consulta help(math.sqrt) o la documentación oficial del módulo. Los guiones bajos iniciales pueden indicar convenciones, pero no impiden el acceso externo como una barrera de seguridad.
dir() y vars() responden a preguntas distintas
dir(instance) puede incluir nombres de su clase y herencia, además de los guardados en la instancia. vars(object) devuelve su __dict__. Es útil para atributos y valores almacenados directamente, pero no todos los objetos tienen ese diccionario.
class User:
role = "reader"
def __init__(self, name):
self.name = name
def label(self):
return f"{self.role}:{self.name}"
user = User("Ada")
print([name for name in dir(user) if name in ("name", "role", "label")])
print(vars(user))
print(user.label())
['label', 'name', 'role']
{'name': 'Ada'}
reader:Ada
name está en la instancia; role y label proceden de la clase. Eso explica la diferencia. Aquí vars(user) es el diccionario real, no una copia: evita modificarlo al explorar. En objetos sin diccionario, como algunas clases con __slots__, vars() puede generar TypeError.
Sin argumentos se examina el espacio de nombres actual
dir() devuelve nombres del espacio local actual, no todas las funciones integradas ni todos los paquetes instalados. En un script nuevo e independiente aparece el nombre definido marker, pero la función integrada abs no figura directamente.
marker = 7
print("marker" in dir())
print("abs" in dir())
True
False
Una consola interactiva o un cuaderno puede conservar nombres de ejecuciones anteriores. Comprueba dónde se llama y qué variables quedaron creadas.
Límites de __dir__() y atributos dinámicos
Un objeto puede personalizar la lista con __dir__() y ofrecer atributos dinámicamente mediante __getattr__(). Un nombre ausente puede ser accesible, mientras que leer un nombre mostrado puede fallar.
class Dynamic:
def __getattr__(self, name):
if name == "answer":
return 42
raise AttributeError(name)
def __dir__(self):
return ["visible"]
item = Dynamic()
print(dir(item))
print("answer" in dir(item))
print(getattr(item, "answer"))
print(hasattr(item, "visible"))
['visible']
False
42
False
El objeto muestra solo visible, pero proporciona realmente answer. Usa dir() para explorar o completar y comprueba documentación y comportamiento. getattr() y hasattr() pueden ejecutar código de búsqueda de atributos; dir() también puede invocar código personalizado. No asumas que estas comprobaciones carecen siempre de efectos secundarios.




