1.1.1 ¿Qué es un módulo?
Además, cuando se espera que el código que se está creando sea realmente grande (puedes usar el número total de líneas de código como una medida útil, pero no muy precisa, del tamaño del código) entonces, se deseará, o más bien, habrá la necesidad de dividirlo en muchas partes, implementado en paralelo por unos cuantos, una docena, varias docenas o incluso varios cientos de desarrolladores.
- Dividir todas las tareas entre los desarrolladores.
- Después, unir todas las partes creadas en un todo funcional.
- Por ejemplo, un determinado proyecto se puede dividir en dos partes principales: La interfaz de usuario (la parte que se comunica con el usuario mediante widgets y una pantalla gráfica).
Cada una de estas partes se puede (muy probablemente) dividir en otras más pequeñas, y así sucesivamente. Tal proceso a menudo se denomina descomposición.
Por ejemplo, si te pidieran organizar una boda, no harías todo tú mismo: encontrarías una serie de profesionales y dividirías la tarea entre todos.
¿Cómo se divide una pieza de software en partes separadas pero cooperantes? Esta es la pregunta. Los módulos son la respuesta.
Entonces, ¿qué es un módulo? El Tutorial de Python lo define como un archivo que contiene definiciones y sentencias de Python, que se pueden importar más tarde y utilizar cuando sea necesario.
El manejo de los módulos consta de dos cuestiones diferentes:
- El primero (probablemente el más común) ocurre cuando se desea utilizar un módulo ya existente - escrito por otra persona o creado por el programador mismo en algún proyecto complejo: en este caso, se considera al programador como el usuario del módulo.
- El segundo ocurre cuando se desea crear un nuevo módulo, ya sea para uso propio o para facilitar la vida de otros programadores - aquí tu eres el proveedor del módulo.
Discutamos ambos por separado.
En primer lugar, un módulo se identifica por su nombre. Si se desea utilizar cualquier módulo, se necesita saber su nombre. Se entrega una cantidad (bastante grande) de módulos junto con Python. Se puede pensar en ellos como una especie de “equipamiento adicional de Python”.
Todos estos módulos, junto con las funciones integradas, forman la Biblioteca Estándar de Python - un tipo especial de biblioteca donde los módulos desempeñan el papel de libros (incluso podemos decir que las carpetas desempeñan el papel de estanterías). Si deseas ver la lista completa de todos los «volúmenes» recopilados en esa biblioteca, se puede encontrar aquí: https://docs.python.org/3/library/index.html.
Cada módulo consta de entidades (como un libro consta de capítulos). Estas entidades pueden ser funciones, variables, constantes, clases y objetos. Si se sabe como acceder a un módulo en particular, se puede utilizar cualquiera de las entidades que almacena.
Comencemos la discusión con uno de los módulos más utilizados, el que lleva por nombre
Para que un módulo sea utilizable, hay que importarlo (piensa en ello como sacar un libro del estante). La importación de un módulo se realiza mediante una instrucción llamada
Supongamos que deseas utilizar dos entidades proporcionadas por el módulo
- Un símbolo (constante) que representa un valor preciso (tan preciso como sea posible usando aritmética de punto flotante doble) de π (aunque usar una letra griega para nombrar una variable es totalmente posible en Python, el símbolo se llama pi - es una solución más conveniente, especialmente para esa parte del mundo que ni tiene ni va a usar un Teclado Griego).
- Una función llamada
sin() (el equivalente informático de la función matemática seno).
Para continuar, debes familiarizarte con un término importante: namespace. No te preocupes, no entraremos en detalles - esta explicación será lo más breve posible.
Un namespace es un espacio (entendido en un contexto no físico) en el que existen algunos nombres y los nombres no entran en conflicto entre sí (es decir, no hay dos objetos diferentes con el mismo nombre). Podemos decir que cada grupo social es un namespace - el grupo tiende a nombrar a cada uno de sus miembros de una manera única (por ejemplo, los padres no darían a sus hijos el mismo nombre).
Esta singularidad se puede lograr de muchas maneras, por ejemplo, mediante el uso de apodos junto con los nombres (funcionará dentro de un grupo pequeño como una clase en una escuela) o asignando identificadores especiales a todos los miembros del grupo (el número de Seguro Social de EE. UU. es un buen ejemplo de tal práctica).
Dentro de un determinado namespace, cada nombre debe permanecer único. Esto puede significar que algunos nombres pueden desaparecer cuando cualquier otra entidad de un nombre ya conocido ingresa al namespace. Mostraremos como funciona y como controlarlo, pero primero, volvamos a las importaciones.
Si el módulo de un nombre especificado existe y es accesible (un módulo es de hecho un archivo fuente de Python), Python importa su contenido, se hacen conocidos todos los nombres definidos en el módulo, pero no ingresan al namespace del código.
Esto significa que puedes tener tus propias entidades llamadas
En este punto, es posible que te estés preguntando como acceder al
Para hacer esto, se debe de mandar llamar el
Este primer ejemplo no será muy avanzado - solo se desea imprimir el valor de sin(½π).
Observa el código en el editor. Así es como se prueba.
>>import math
>>print(math.sin(math.pi/2))
El código genera el valor esperado:
Observa el fragmento a continuación, esta es la forma en que se habilitan los nombres de
Ahora te mostraremos cómo pueden dos namespaces (el tuyo y el del módulo) coexistir.
Echa un vistazo al ejemplo en la ventana del editor.
Hemos definido nuestros propios
Reescribamos el código anterior para incorporar esta nueva técnica.
Aquí está:
>>from math import sin, pi
>>print(sin(pi/2))
El resultado debe de ser el mismo que el anterior, se han empleado las mismas entidades:
¿El código parece más simple? Quizás, pero el aspecto no es el único efecto de este tipo de importación. Veamos más a detalle esto.
Observa el código en el editor. Analízalo cuidadosamente:
- La línea 01: lleva a cabo la importación selectiva.
- La línea 03: hace uso de las entidades importadas y obtiene el resultado esperado (
1.0 ). - Las líneas 05 a la 12: redefinen el significado de
pi ysin - en efecto, reemplazan las definiciones originales (importadas) dentro del namespace del código. - La línea 15: retorna
0.99999999 , lo cual confirma nuestras conclusiones.
Hagamos otra prueba. Observa el código a continuación:
Aquí, se ha invertido la secuencia de las operaciones del código:
- Las líneas del 01 al 08: definen nuestro propio
pi ysin . - La línea 11: hace uso de ellas (0.99999999 aparece en pantalla).
- La línea 13: lleva a cabo la importación - los símbolos importados reemplazan sus definiciones anteriores dentro del namespace.
- La línea 15: retorna
1.0 como resultado.
1.1.9 RESUMEN DE LA SECCIÓN
1.1.10 CUESTIONARIO DE SECCIÓN
Pregunta 3: Has escrito una función llamada




