Ordenar el proyecto y usar módulos

Ciencia y tecnologíaOrdenar el proyecto y usar módulos

A medida que un programa crece conviene organizar sus piezas en archivos con responsabilidades claras. Un módulo de Python es un archivo que puedes importar desde otro. En esta lección separarás cálculos y ejecución, utilizarás una parte de la biblioteca estándar y evitarás que importar una función active por sorpresa un programa interactivo.

Separar responsabilidades

Imagina un archivo que contiene fórmulas, preguntas, lectura de archivos y un menú largo. Todo puede funcionar pero cuesta localizar una operación concreta. Una separación sencilla permite encontrar el código y probarlo sin recorrer instrucciones ajenas. No se trata de crear muchas carpetas sino de reducir la mezcla de responsabilidades.

Para empezar utiliza dos archivos en la misma carpeta. calculos.py contendrá una función. principal.py la importará y mostrará un resultado. Mantener ambos juntos evita introducir todavía rutas de paquetes y configuraciones adicionales. La estructura debe ayudarte a aprender, no convertirse en un ejercicio independiente de administración del sistema.

Contenido de calculos.py:

def calcular_cajas(objetos, capacidad):
    return (objetos + capacidad - 1) // capacidad

Contenido de principal.py:

from calculos import calcular_cajas

print(calcular_cajas(23, 5))

Ejecuta principal.py. La importación utiliza el nombre del módulo sin la extensión .py. Si aparece ModuleNotFoundError comprueba los nombres y que ambos archivos estén en la misma carpeta. No instales un paquete llamado calculos para intentar resolver un archivo local que falta o está mal colocado.

Qué sucede al importar

Al importar un módulo Python ejecuta sus instrucciones de nivel superior cuando lo carga por primera vez en ese proceso. Las definiciones de funciones quedan disponibles pero no se ejecuta su cuerpo hasta llamarlas. Un input escrito directamente fuera de una función sí se ejecutaría durante la importación.

Por eso conviene evitar preguntas y menús en el nivel superior de un módulo destinado a reutilizarse. Un archivo de pruebas que importe calcular_cajas no debería quedarse esperando una respuesta del usuario. Ese comportamiento dificulta tanto las pruebas como la comprensión del flujo del programa.

Puedes reunir el arranque en una función main y utilizar una condición especial que la invoque solo cuando ejecutas ese archivo como programa principal. No necesitas memorizar todavía todos los detalles internos de __name__. Comprende la intención: diferenciar ejecución directa e importación.

def main():
    print("Este archivo se está ejecutando directamente")

if __name__ == "__main__":
    main()

Guarda el ejemplo como arranque.py. Si lo ejecutas directamente aparece el mensaje. Si otro archivo hace import arranque el mensaje no se muestra. Esta convención será parte de la aplicación final para que podamos importar sus funciones sin iniciar el menú.

Utilizar la biblioteca estándar

Python incluye módulos para muchas tareas habituales. Usarlos no requiere instalar paquetes externos. Por ejemplo, pathlib ofrece una forma de representar rutas. En una lección posterior utilizaremos Path para localizar archivos de datos junto al programa. No hace falta conocer toda la biblioteca para aprovechar una pieza concreta.

from pathlib import Path

carpeta = Path.cwd()
print(carpeta)

Path.cwd() devuelve la carpeta de trabajo actual. Puede ser distinta de la carpeta donde está guardado el archivo que ejecutas. Esta diferencia explica por qué algunos programas encuentran un archivo cuando se lanzan desde un sitio y no desde otro. Mostrar la ruta durante una investigación ayuda a comprobar qué está ocurriendo.

No llames pathlib.py a tu propio archivo. Python podría encontrarlo antes que el módulo de la biblioteca estándar y producir una importación inesperada. El mismo cuidado se aplica a json.py, random.py o cualquier nombre que pretendas importar. Los nombres descriptivos de tu proyecto reducen estas colisiones.

Importaciones claras

La forma from calculos import calcular_cajas permite utilizar directamente calcular_cajas. La forma import calculos exige escribir calculos.calcular_cajas. Ambas son válidas. La segunda hace visible de dónde procede una operación. Escoge una forma coherente y evita importar todos los nombres mediante un asterisco en este curso.

Las importaciones suelen colocarse al principio del archivo para ver de qué depende. Si dos archivos intentan importarse mutuamente puedes crear una dependencia circular. Antes de complicarlo revisa si una función común debería vivir en un tercer módulo sencillo o si una responsabilidad está situada en el lugar equivocado.

No necesitas convertir cada función en un archivo. Para el gestor final utilizaremos un módulo de lógica, otro de almacenamiento y un archivo principal con el menú. Esa separación sigue las tareas de la aplicación y permite comprobar cada parte. Una docena de archivos con dos líneas cada uno probablemente dificultaría el aprendizaje.

Documentar cómo se ejecuta

Un proyecto necesita instrucciones mínimas que puedas seguir después de varias semanas. Anota el archivo principal, la orden de ejecución y la ubicación de los datos. Si requiere únicamente Python 3 y la biblioteca estándar dilo expresamente. No añadas instrucciones de instalación de paquetes que el programa no utiliza.

Conserva todos los archivos necesarios juntos al copiar el proyecto. Si compartes únicamente principal.py pero este importa calculos.py la otra persona no podrá ejecutarlo. Probar una copia en una carpeta nueva permite descubrir dependencias locales que estabas dando por supuestas.

Errores habituales

  • Añadir .py al nombre de una importación corriente.
  • Ejecutar preguntas de teclado al importar un módulo de funciones.
  • Usar el nombre de un módulo estándar para un archivo propio.
  • Repartir el código sin una responsabilidad clara por archivo.
  • Confundir la carpeta actual con la carpeta del programa.

Lo que deberías recordar

  • Un módulo permite reutilizar código desde otro archivo.
  • Importar puede ejecutar instrucciones de nivel superior.
  • La condición de __name__ separa importación y ejecución directa.
  • Una organización pequeña y explícita facilita las pruebas.

Ejercicio práctico

Crea calculos.py y principal.py con el ejemplo de cajas. Anota en la decimocuarta hoja qué responsabilidad tiene cada archivo. Añade el patrón de arranque al principal y verifica la diferencia entre ejecutarlo e importarlo desde otro archivo.

Copia ambos a una carpeta nueva y vuelve a ejecutar el programa. Registra la orden utilizada y el resultado cinco. Después consulta Path.cwd() desde esa ejecución y apunta la ruta. Esta práctica prepara la distinción que necesitarás para guardar datos en un lugar previsible.

Siguiente capítulo: Leer y guardar archivos de texto.

Volver al índice del curso de programación desde cero.

Últimos posts

Artículos más vistos

Horóscopo diario
Menú diario