El gran libro de Python. Marco Buttu
Чтение книги онлайн.
Читать онлайн книгу El gran libro de Python - Marco Buttu страница 18
NOTA
En la sección Los módulos del Capítulo 3 veremos que algunos módulos (inte- grados y paquetes de espacios de nombres) no se pueden reconducir a un archivo y, por tanto, no tienen los atributos _ _file_ _ y _ _cached_ _.
La etiqueta (tag) que identifica la implementación del intérprete y la versión de Python la da imp.get_tag():
El módulo imp también nos permite obtener el nombre del archivo fuente a partir del nombre del archivo importado y viceversa:
Cuando un módulo Python se ejecuta como script, su bytecode no se guarda en el disco:
NOTA
El comando rm elimina un archivo o un directorio del sistema de archivos. En el caso de un directorio, es preciso utilizar la opción -r.
Sin embargo, podemos solicitar explícitamente su almacenamiento. Para ello, se utiliza la opción -m y se pasa al intérprete el nombre del módulo y no el del archivo:
Si en combinación con la opción -m se utiliza la opción -O, entonces se genera un byte-code optimizado (se eliminan las instrucciones assert), el cual se guarda en un archivo con sufijo .pyo:
NOTA
Ante dos archivos binarios file_A y file_B, el comando diff file_A file_B no muestra ninguna salida si ambos archivos son idénticos; si no, indica que son distintos.
También podemos elegir no guardar en el sistema de archivos las versiones compiladas de los módulos importados. Para ello, podemos utilizar la opción -B:
o bien podemos asignar a la variable de entorno PYTHONDONTWRITEBYTECODE el valor true:
o bien podemos hacerlo cuando el programa se está ejecutando, escribiendo sys.dont_write_bytecode = True:
Etiquetas y objetos
A menudo se dice que todo en Python son objetos. En realidad, como ya hemos dicho en más de una ocasión, los objetos no forman parte del código, sino que este los genera cuando el programa se está ejecutando. En esta sección daremos una definición formal de objeto, recogiendo cuanto hemos sembrado en la primera parte del libro. Además veremos con mayor profundidad cuál es el vínculo entre objetos y etiquetas, puesto que podría no ser evidente de inmediato para aquellos que solo tienen experiencia en programación con lenguajes de tipificación estática.
Definición de objeto
Los objetos en Python son estructuras de datos generadas por el código en ejecución, a las cuales este se refiere. Precisamente, son las expresiones que generan o hacen referencia a los objetos.
Hasta que no se utilizan, los objetos se mantienen en la memoria del ordenador para que puedan ser llamados cuando sean necesarios; sin embargo, en el momento en que no hay ninguna etiqueta que hace referencia a ellos, un mecanismo singular, denominado recolector de basura (garbage collection), procede a liberar la memoria que ocupaban.
NOTA
Podemos gestionar el mecanismo del recolector de basura utilizando el módulo gc, que proporciona una interfaz para el mismo: http://docs.python.org/3/library/gc.html.
Los objetos tienen un tipo y una identidad. Podemos obtener el tipo de un objeto tanto mediante la clase integrada type como mediante el atributo _ _class_ _ del objeto:
La identidad del objeto, que en Python corresponde a su dirección en la memoria, es devuelta por la función integrada id():
Además, observamos que dos objetos diferentes tienen identidades distintas incluso teniendo el mismo valor:
NOTA
Cuando el intérprete encuentra los literales de los tipos mutables, por cuestiones de optimización (independientemente de la implementación), prefiere la reutilización de objetos ya existentes a la creación de otros nuevos, especialmente si se trata de objetos que ocupan poco espacio en memoria:
Cabe señalar que, el hecho de que cada estructura de datos generada por el código Python en ejecución sea un objeto, no significa que el único paradigma de programación soportado sea el de objetos. Como hemos dicho en la sección El estado del arte, Python es un lenguaje multiparadigma.
El vínculo entre las etiquetas y los objetos
Como ya sabemos, en Python no existen las declaraciones, y el tipo de los objetos es establecido cuando el programa se ejecuta. Quizás ahora nos preguntemos cuál es el papel de las etiquetas, puesto que podemos asignar objetos de distintos tipos a la misma etiqueta:
La idea es que una etiqueta es simplemente un identificador mediante el cual se hace referencia al objeto. Esto significa que la primera asignación vincula la etiqueta var al objeto que representa el número 44, de tipo int, como se muestra en la Figura 1.1.
Figura 1.1 - Asignación de la etiqueta var a un número entero de valor 44.
La segunda asignación vincula var a un nuevo objeto, que representa el número 99 y también de tipo int, y ya no existe ninguna vinculación entre var y el objeto que representa el número 44. Además, este último no tiene ninguna etiqueta que haga referencia a aquel, por lo que no puede ser utilizado de ningún modo; Python, por tanto, libera la memoria que ocupaba, como se muestra en la Figura 1.2.
Figura 1.2 - Asignación de la etiqueta var a un nuevo número entero, de valor 99. El 44 deja la memoria libre.
Por