4.3. Uso de type, str, dir y otras funciones incorporadas

Python cuenta con 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).

4.3.1. La función type

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 4.5. 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
True
1 type toma cualquier cosa y devuelve su tipo. Y quiero decir cualquier cosa: enteros, cadenas, listas, diccionarios, tuplas, funciones, clases, módulos, incluso se aceptan los 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 info, como veremos en seguida.

4.3.2. La función str

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

Ejemplo 4.6. Presentación de str

>>> str(1)          1
'1'
>>> jinetes = ['guerra', 'peste', 'hambre']
>>> jinetes
['guerra', 'peste', 'hambre']
>>> jinetes.append('Powerbuilder')
>>> str(jinetes)   2
"['guerra', 'peste', 'hambre', '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. Fíjese que la representación como cadena del módulo incluye su ruta en el disco, así que es probable que usted obtenga algo 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 info, como veremos en breve.

En el corazón de nuestra función info 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 4.7. 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 todos los métodos de una lista. Advierta que la lista devuelta no contiene los propios métodos, sino sus nombres en forma de cadenas.
2 d es un diccionario, así que dir(d) devuelve una lista con los nombres de los métodos de un 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 cosas definidas en el módulo, incluidos atributos incorporados como __name__, __doc__ y cualesquiera otros atributos y métodos que se hayan definido. En este caso, odbchelper sólo tiene definido un método, la función buildConnectionString que estudiamos en el Capítulo 2.

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

Ejemplo 4.8. Presentación de callable

>>> import string
>>> string.punctuation           1
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.join                  2
<function join at 00C55A7C>
>>> callable(string.punctuation) 3
False
>>> callable(string.join)        4
True
>>> 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 Se desaconseja el uso de las funciones del módulo string (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 invocarse; es una cadena. (Una cadena tiene métodos a los que invocar, pero no podemos hacerlo con la propia cadena.)
4 string.join puede ser invocada; es una función que toma dos argumentos.
5 Cualquier objeto al que se pueda invocar 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.

4.3.3. Funciones incorporadas

type, str, dir y el resto de funciones incorporadas de Python se agrupan en un módulo especial llamado __builtin__ (con dos subrayados antes y después). Por si sirve de ayuda, puede interpretarse que Python ejecuta automáticamente from __builtins__ import * al inicio, 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 en grupo, obteniendo información sobre el módulo __builtins__. Y fíjese, tenemos una función para ello: se llama info. Inténtelo usted y prescinda ahora de la lista; nos sumergiremos más tarde en algunas de las funciones principales. (Algunas de las clases de error incorporadas, como AttributeError, deberían resultarle familiares.)

Ejemplo 4.9. Atributos y funciones incorporados

>>> from apihelper import info
>>> import __builtin__
>>> info(__builtin__, 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.

[...cortado...]
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 para recordar cómo se usan estos módulos, Python está autodocumentado en su mayoría.

Lecturas complementarias sobre las funciones incorporadas