Capítulo 2. El poder de la introspección

Tabla de contenidos

2.1. Inmersión

Este capítulo trata uno de los puntos fuertes de Python: la introspección. Como usted sabe, todo en Python es un objeto, y la introspección es código que examina como objetos otros módulos y funciones en memoria, obtiene información sobre ellos y los maneja. De paso, definiremos funciones sin nombre, llamaremos a funciones con argumentos sin orden, y haremos referencia a funciones cuyos nombres desconocemos.

Aquí hay un programa Python completo y funcional. Debería usted comprenderlo sólo observándolo. Las líneas numeradas ilustran conceptos cubiertos en Conozcamos Python. No se preocupe si el resto del código le parece inquietante; aprenderá todo sobre él en este capítulo.

Ejemplo 2.1. apihelper.py

Si aún no lo ha hecho, puede descargar este y otros ejemplos de este libro.


def help(object, spacing=10, collapse=1): 1 2 3
    """Print methods and docstrings.
    
    Takes module, class, list, dictionary, or string."""
    methodList = [method for method in dir(object) if callable(getattr(object, method))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                      (method.ljust(spacing),
                       processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

if __name__ == "__main__":                4 5
    print help.__doc__
1 Este módulo tiene una funcion, help. Según su declaración, admite tres parámetros: object, spacing y collapse. Los dos últimos son en realidad parámetros opcionales, como veremos en seguida.
2 La función help tiene una cadena de documentación de varias líneas que describe sucintamente el propósito de la función. Advierta que no se indica valor de retorno; esta función se utilizará solamente por sus efectos, no por su valor.
3 El código de la función está sangrado.
4 El truco if __name__ permite a este programa hacer algo útil cuando se ejecuta aislado, sin que esto interfiera con su uso como módulo por otros programas. En este caso, el programa simplemente imprime la cadena de documentación de la función help.
5 Las sentencias if usan == para la comparación, y no son necesarios los paréntesis.

La función help está diseñada para ser utilizada por usted, el programador, mientras trabaja en el entorno de programación Python. Toma cualquier objeto que tenga funciones o métodos (como un módulo, que tiene funciones, o una lista, que tiene métodos) y muestra las funciones y sus cadenas de documentación.

Ejemplo 2.2. Ejemplo de uso de apihelper.py

>>> from apihelper import help
>>> li = []
>>> help(li)
append     L.append(object) -- append object to end
count      L.count(value) -> integer -- return number of occurrences of value
extend     L.extend(list) -- extend list by appending list elements
index      L.index(value) -> integer -- return index of first occurrence of value
insert     L.insert(index, object) -- insert object before index
pop        L.pop([index]) -> item -- remove and return item at index (default last)
remove     L.remove(value) -- remove first occurrence of value
reverse    L.reverse() -- reverse *IN PLACE*
sort       L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1

Por omisión, la salida se formatea para que sea de fácil lectura. Las cadenas de documentación de varias líneas se unen en una sola línea larga, pero esta opción puede cambiarse especificando 0 como valor del argumento collapse. Si los nombres de función tienen más de diez caracteres, se puede especificar un valor mayor en el argumento spacing para hacer más legible la salida.

Ejemplo 2.3. Uso avanzado de apihelper.py

>>> import odbchelper
>>> help(odbchelper)
buildConnectionString Build a connection string from a dictionary Returns string.
>>> help(odbchelper, 30)
buildConnectionString          Build a connection string from a dictionary Returns string.
>>> help(odbchelper, 30, 0)
buildConnectionString          Build a connection string from a dictionary
    
    Returns string.