Visualización de los nombres asociados a un objeto

Ya sabemos que la función integrada dir nos devuelve el conjunto de nombres asociados a un objeto. Por ejemplo, si pasamos una lista como argumento:

a = list([2, 4, 6])
print(dir(a))

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

...obtenemos, entre otras cosas, los métodos asociados a nuestra lista: append, clear, copy, etc.

Sin embargo, el resultado obtenido no favorece en exceso la identificación de los atributos y métodos que tal vez estemos buscando pues se incluyen tanto los nombres privados (aquellos que comienzan por un doble subrayado) como los marcados como "de uso interno" (los que comienzan por un subrayado).

Para obtener solamente el conjunto de nombres que nos interesan podríamos crear una función que acepte el nombre del objeto y devuelva solo aquellos nombres que no comiencen con un símbolo de subrayado:

def names(obj):
    for n in dir(obj):
        if not n.startswith("_"):
            print(n)

Ahora, si ejecutamos nuestra función pasando la variable "a":

names(a)

append
clear
copy
count
extend
index
insert
pop
remove
reverse
sort

...obtenemos los nombres buscados.

Más práctico todavía puede ser crear esta función usando una función lambda y una list comprenhension:

names = lambda obj: print([n for n in dir(obj) if not n.startswith("_")])

Como puede apreciarse, la función (que asignamos a la variable names) recibe un único argumento de entrada ("obj") y, en la list comprenhension, ejecutamos la función dir pasando como argumento el objeto en cuestión y recorremos los nombres devueltos filtrando aquellos que no comienzan con el carácter subrayado. La lista final obtenida se imprime usando la función print obteniendo una salida compacta.

Ahora, si pasamos a nuestra función names la variable "a":

names(a)

['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

...obtenemos la lista de nombres buscados.

Categoría
Enviado por admin el Lun, 11/01/2021 - 15:02