Curso de Python / Crear módulos y dividir el código con import

Un módulo es una unidad reutilizable de código Python, que puede empezar como un archivo .py. import busca e inicializa el módulo; no se limita a copiar su texto, por lo que importan la ubicación de los archivos y las instrucciones situadas en el nivel superior.

Separar el cálculo de la aplicación

En esta práctica, expense_math.py contiene una función reutilizable y app.py la llama. Guarda ambos en la misma carpeta. Utiliza guiones bajos en los nombres de módulos, no guiones, y evita nombres como json.py o csv.py, que pueden ocultar módulos de la biblioteca estándar.

import expense_math incorpora el nombre del módulo y permite acceder a expense_math.total. from expense_math import total incorpora directamente el nombre de la función. La segunda forma puede ser cómoda, pero debes vigilar las colisiones con otros nombres.

La guía oficial de módulos explica la inicialización y las formas de importación.

Crear los dos archivos completos y ejecutarlos

Guarda el siguiente contenido en expense_math.py utilizando UTF-8:

def total(amounts):
    return sum(amounts)

En la misma carpeta, guarda este segundo archivo como app.py:

import expense_math

print(expense_math.total([3500, 8000, 2500]))

Abre una terminal en la carpeta que contiene ambos archivos, selecciona el entorno del proyecto y ejecuta:

python app.py

El resultado debe ser 14000. No se necesita ningún paquete externo. Conserva exactamente los nombres del ejercicio para que la búsqueda encuentre expense_math; en macOS o Ubuntu, fuera del entorno, adapta el nombre de la orden a python3 cuando corresponda.

Comprender la búsqueda y la inicialización

La búsqueda de módulos depende del modo de ejecución, la estructura del proyecto y el entorno instalado. Ante ModuleNotFoundError, comprueba primero la escritura del nombre, el intérprete y la ubicación de los archivos. No añadas rutas arbitrarias a sys.path ni copies archivos a una instalación global para ocultar un problema de organización.

Las instrucciones del nivel superior se ejecutan al importar el módulo por primera vez en el proceso. Si allí colocas input() o una operación de borrado, importar el módulo puede iniciar esa acción. Define el trabajo reutilizable en funciones y ejecútalo mediante una entrada explícita.

Este esquema genérico representa el mismo patrón de archivo principal y archivo auxiliar:

practice/
  main.py
  helper.py

En el ejercicio concreto sus nombres son app.py y expense_math.py; no los cambies por los del esquema. Los módulos normalmente quedan en caché después de importarse, por lo que reiniciar el proceso ayuda a comprobar los cambios de código.

Probar la reutilización y evitar dependencias circulares

  1. Cambia un importe en app.py y comprueba que la misma función auxiliar calcula el nuevo total.
  2. Añade temporalmente una impresión fuera de la definición de la función auxiliar para observar cuándo se ejecuta. Después elimínala.
  3. Explica por qué un archivo de aplicación llamado json.py podría ocultar el módulo JSON estándar.

Si dos módulos se importan mutuamente, uno puede solicitar nombres antes de que termine la inicialización del otro. Mueve la lógica compartida a un tercer módulo o simplifica la dirección de las dependencias. Los paquetes y el punto de entrada muestran cómo evitar que una importación ejecute accidentalmente la aplicación.