Marco Buttu

El gran libro de Python


Скачать книгу

integrada print()

      La forma general de la función integrada print() es la siguiente:

image

      Si no se le pasa ningún objeto, imprime una línea en blanco:

image

      En cambio, si se le pasa uno o más objetos obj_i, los imprime separándolos con la cadena sep, que por defecto es un espacio, y terminando la impresión con la cadena end, que por defecto es un salto de línea:

image

      Básicamente, la función print() solo crea la cadena:

image

      para después pasarla al método write() del objeto asignado al parámetro file. Por tanto, y puesto que por defecto tenemos file=sys.stdout, la siguiente print():

image

      equivale a esta llamada al método sys.stdout.write():

image

      Así, si como archivo no utilizamos la salida estándar sino un archivo físico:

image

      el código equivalente a la print() es el siguiente:

image

      El parámetro flush sirve para forzar el vaciado del buffer inmediatamente después de la impresión. Por defecto, tenemos flush=False, lo que significa que el contenido del buffer no se escribe inmediatamente en el archivo:

image

      En cambio, si escribimos flush=True, el buffer se vacía en cada impresión:

image

      Hablaremos del buffering en la sección Los archivos del Capítulo 3 y en el Apéndice C. Si quisiéramos efectuar un elevado número de impresiones en un archivo en lugar de en pantalla, sería genial poder evitar pasar cada vez el archivo a la print() como argumento. Podemos hacerlo cambiando temporalmente sys.stdout, dado que este se asigna por defecto al parámetro file:

image

      Obtener información sobre los objetos

      El término introspección se utiliza para referirse a la capacidad de obtener información sobre los objetos. Python tiene muchísimas herramientas para hacer introspección, muchas de las cuales ya hemos visto, como la clase integrada type y la función integrada id():

image

      las funciones integradas hasattr() y dir():

image

      las funciones integradas isinstance() y callable():

image

      y la palabra clave in:

image

      Más adelante veremos muchos otros, como la palabra clave is, que podemos utilizar para saber si dos objetos son idénticos:

image

      Profundizaremos en el concepto de identidad dentro de poco. Por el momento concentrémonos en dos importantes herramientas para la introspección que se utilizan principalmente en el modo interactivo: las funciones integradas dir() y help().

      La función integrada dir()

      La función integrada dir(), como ya hemos dicho, devuelve una lista de los nombres de los atributos más significativos de un objeto:

image

      La finalidad de la función integrada dir() no es la de comprobar si un objeto tiene un atributo concreto, pues no todos los atributos del objeto aparecen en la lista devuelta por la función:

image

      Para comprobar si un objeto tiene un atributo indicado debemos utilizar hasattr():

image

      El ámbito principal de uso de dir() es la ayuda al programador durante la fase de escritura del código. Cuando programan, a menudo no recuerdan de memoria todos los atributos de un objeto, y normalmente consultan la documentación para intentar encontrar una lista de los atributos, esperando que a partir del nombre se pueda deducir el significado.

      Por ejemplo, estamos escribiendo el código y necesitamos obtener la versión en mayúsculas de una cadena de texto. Sabemos que las cadenas tienen un método que devuelve una copia de la misma en mayúsculas, pero no recordamos el nombre. Es en este momento cuando dir() se convierte en nuestra mejor amiga. Iniciamos el intérprete en modo interactivo y controlamos la lista de los atributos de las cadenas de texto:

image

      ¡Premio! Es el atributo str.upper():

image

      Por tanto, debemos utilizar la función integrada dir() como si fuera el índice de nuestra documentación. De forma parecida a un índice, dir() nos proporciona una lista de los nombres, pero no nos da información acerca de su significado.

      La función integrada help() y las cadenas de documentación

      Para obtener información sobre un atributo, podemos utilizar la función integrada help(). Para entender cuándo y cómo utilizarla, consideremos un ejemplo práctico. Supongamos que debemos escribir el código para poder leer las líneas del archivo siguiente:

image

      y obtener para cada línea la suma de sus elementos (los números separados por un punto y coma). En la sección Un primer vistazo a los archivos, ya hemos podido ver que podemos leer las líneas de un archivo de una en una, como cadenas de texto. Ahora queremos saber si las cadenas tienen un método que permita separarlas según un carácter en concreto (en nuestro caso, el punto y coma). Así, abrimos la shell interactiva y escribimos dir(str). Vemos que las cadenas de texto tienen el método str.split() que parece ser el que buscábamos, por lo que intentaremos saber si se comporta tal y como queremos:

image

      Ya sabemos que str.split() divide la cadena según los espacios. Pero nosotros queremos dividirla según el punto y coma, por lo que nos interesa saber si podemos pasar a str.split() un argumento que indique