2.3. type, str, dir, y otras funciones incorporadas

Python tiene un pequeño conjunto de funciones incorporadas enormemente útiles. Todas las demás funciones están repartidas en módulos. Esto es una decisión consciente de diseño, para que el núcleo del lenguaje no se hinche como en otros lenguajes de script (cof cof, Visual Basic).

La función type devuelve el tipo de dato de cualquier objeto. Los tipos posibles se enumeran en el módulo types. Esto es útil para funciones auxiliares que pueden manejar distintos tipos de datos.

Ejemplo 2.6. Presentación de type

>>> type(1)           1
<type 'int'>
>>> li = []
>>> type(li)          2
<type 'list'>
>>> import odbchelper
>>> type(odbchelper)  3
<type 'module'>
>>> import types      4
>>> type(odbchelper) == types.ModuleType
1
1 type toma cualquier cosa y devuelve su tipo. Y quiero decir cualquier cosa: enteros, cadenas, listas, diccionarios, tuplas, funciones, clases, módulos, incluso tipos.
2 type puede tomar una variable y devolver su tipo.
3 type funciona también con módulos.
4 Pueden utilizarse las constantes del módulo types para comparar tipos de objetos. Esto es lo que hace la función help, como veremos en seguida.

La función str transforma un dato en una cadena. Todos los tipos de datos pueden transformarse en cadenas.

Ejemplo 2.7. Presentación de str

>>> str(1)          1
'1'
>>> horsemen = ['war', 'pestilence', 'famine']
>>> horsemen.append('Powerbuilder')
>>> str(horsemen)   2
"['war', 'pestilence', 'famine', 'Powerbuilder']"
>>> str(odbchelper) 3
"<module 'odbchelper' from 'c:\\docbook\\dip\\py\\odbchelper.py'>"
>>> str(None)       4
'None'
1 Para tipos simples de datos como los enteros, el comportamiento de str es el esperado, ya que casi todos los lenguajes tienen una función que convierte enteros en cadenas.
2 Sin embargo, str funciona con cualquier objeto de cualquier tipo. Aquí funciona sobre una lista que hemos construido por partes.
3 str funciona también con módulos. Advierta que la representación como cadena del módulo incluye la ruta del módulo en el disco, por lo que lo que usted obtenga será diferente.
4 Un comportamiento sutil pero importante de str es que funciona con None, el valor nulo de Python. Devuelve la cadena 'None'. Aprovecharemos esto en la función help, como veremos en seguida.

En el corazón de nuestra función help está la potente función dir. dir devuelve una lista de los atributos y métodos de cualquier objeto: módulos, funciones, cadenas, listas, diccionarios... prácticamente todo.

Ejemplo 2.8. Presentación de dir

>>> li = []
>>> dir(li)           1
['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> d = {}
>>> dir(d)            2
['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'setdefault', 'update', 'values']
>>> import odbchelper
>>> dir(odbchelper)   3
['__builtins__', '__doc__', '__file__', '__name__', 'buildConnectionString']
1 li es una lista, luego dir(li) devuelve una lista de los métodos de una lista. Advierta que la lista devuelta contiene los nombres de los métodos en forma de cadenas, no los propios métodos.
2 d es un diccionario, luego dir(d) devuelve una lista con los nombres de los métodos de diccionario. Al menos uno de estos, keys, debería serle familiar.
3 Aquí es donde empieza lo interesante. odbchelper es un módulo, por lo que dir(odbchelper) devuelve una lista con todo lo definido en el módulo, incluidos atributos incorporados, como __name__ y __doc__, y cualesquiera otros atributos y métodos que se hayan definido. En este caso, odbchelper tiene un solo método definido, la función buildConnectionString que estudiamos en Conozcamos Python.

Finalmente, la función callable toma cualquier objeto y devuelve 1 si se puede llamar al objeto, o 0 en caso contrario. Los objetos que pueden ser llamados son funciones, métodos de clase o incluso las propias clases. (Más sobre clases en el capítulo 3).

Ejemplo 2.9. Presentación de callable

>>> import string
>>> string.punctuation           1
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.join                  2
<function join at 00C55A7C>
>>> callable(string.punctuation) 3
0
>>> callable(string.join)        4
1
>>> print string.join.__doc__    5
join(list [,sep]) -> string

    Return a string composed of the words in list, with
    intervening occurrences of sep.  The default separator is a
    single space.

    (joinfields and join are synonymous)
1 Las funciones del módulo string están desaconsejadas (aunque mucha gente utiliza la función join), pero el módulo contiene muchas constantes útiles como string.puctuation, que contiene todos los signos habituales de puntuación.
2 string.join es una función que une una lista de cadenas.
3 string.punctuation no puede llamarse; es una cadena. (Una cadena tiene métodos que pueden llamarse, pero la propia cadena no).
4 string.join puede ser llamada; es una función que toma dos argumentos.
5 Cualquier objeto que pueda llamarse puede tener una cadena de documentación. Utilizando la función callable sobre cada uno de los atributos de un objeto, podemos averiguar cuáles nos interesan (métodos, funciones, clases) y cuáles queremos pasar por alto (constantes, etc.) sin saber nada sobre el objeto por anticipado.

type, str, dir y el resto de funciones incorporadas de Python se agrupan en un módulo especial llamado __builtins__. (Con dos subrayados antes y después). Por si sirve de ayuda, puede interpretarse que Python ejecuta automáticamente from __builtins__ import * al iniciarse, con lo que se importan todas las funciones “incorporadas” en el espacio de nombres de manera que puedan utilizarse directamente.

La ventaja de interpretarlo así es que se puede acceder a todas las funciones y atributos incorporados como un grupo, obteniendo información sobre el módulo __builtins__. E imagíneselo, tenemos una función para ello: se llama help. Inténtelo usted y prescinda ahora de la lista; nos sumergiremos más tarde en algunas de las principales funciones. (Algunas de las clases de error incorporadas, como AttributeError, deberían resultarle familiares).

Ejemplo 2.10. Atributos y funciones incorporados

>>> from apihelper import help
>>> help(__builtins__, 20)
ArithmeticError      Base class for arithmetic errors.
AssertionError       Assertion failed.
AttributeError       Attribute not found.
EOFError             Read beyond end of file.
EnvironmentError     Base class for I/O related errors.
Exception            Common base class for all exceptions.
FloatingPointError   Floating point operation failed.
IOError              I/O operation failed.

[...snip...]
Nota
Python se acompaña de excelentes manuales de referencia, que debería usted leer detenidamente para aprender todos los módulos que Python ofrece. Pero mientras en la mayoría de lenguajes debe usted volver continuamente sobre los manuales (o las páginas de manual, o, Dios le socorra, MSDN) para recordar cómo se usan estos módulos, Python está ampliamente autodocumentado.

Lecturas complementarias