Definir e importar módulos de Python

Beginner

This tutorial is from open-source community. Access the source code

Introducción

En este laboratorio, aprenderás sobre los módulos de Python, que son archivos que contienen código de Python y que se pueden importar y utilizar en otros programas. Este enfoque modular promueve la reutilización del código y ayuda a organizar los programas en componentes lógicos.

Comprenderás qué son los módulos de Python y por qué son útiles, aprenderás cómo crear tus propios módulos, practicarás el uso de la declaración import de diferentes maneras y entenderás el concepto de un módulo principal y cuándo se ejecuta el código. Los prerrequisitos incluyen un conocimiento básico de la sintaxis y las funciones de Python, y familiaridad con la creación y ejecución de scripts de Python. Se recomienda reiniciar la sesión del intérprete de Python antes de comenzar este ejercicio para tener un entorno limpio.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 97%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Comprender los módulos de Python

En Python, un módulo es como un contenedor que almacena definiciones y declaraciones de Python. Es esencialmente un archivo, y el nombre de este archivo es el nombre del módulo con la extensión .py agregada al final. Puedes pensar en los módulos como cajas de herramientas. Te ayudan a organizar tu código de Python de manera lógica, lo que facilita su reutilización y mantenimiento. Al igual que guardarías diferentes herramientas en cajas separadas para una mejor organización, puedes agrupar código de Python relacionado en diferentes módulos.

Echemos un vistazo a los archivos que se han configurado para este laboratorio:

  1. Primero, abriremos el archivo stock.py en el editor para ver su contenido. Para hacer esto, usaremos los siguientes comandos. El comando cd cambia el directorio al directorio project donde se encuentra nuestro archivo, y el comando cat muestra el contenido del archivo.
cd ~/project
cat stock.py

Este archivo stock.py define una clase Stock. Una clase es como un plano para crear objetos. En este caso, la clase Stock representa una acción. Tiene atributos (que son como características) para el nombre de la acción, el número de acciones y el precio. También tiene un método (que es como una función asociada a la clase) para calcular el costo de la acción.

  1. A continuación, examinemos el archivo pcost.py. Usaremos el comando cat nuevamente para ver su contenido.
cat pcost.py

Este archivo define una función llamada portfolio_cost(). Una función es un bloque de código que realiza una tarea específica. La función portfolio_cost() lee un archivo de cartera y calcula el costo total de todas las acciones en esa cartera.

  1. Ahora, echemos un vistazo a los datos de muestra de la cartera. Usaremos el comando cat para ver el contenido del archivo portfolio.dat.
cat portfolio.dat

Este archivo contiene datos de acciones en un formato simple. Cada línea tiene el símbolo de cotización de la acción, el número de acciones y el precio por acción.

Usar la declaración import

La declaración import de Python es una herramienta poderosa que te permite usar código de otros módulos en tu programa actual. Es como pedir prestadas herramientas de otras cajas de herramientas. Practiquemos el uso de diferentes formas de importar código:

  1. Primero, necesitamos iniciar el intérprete de Python. El intérprete de Python es un programa que ejecuta código de Python. Usaremos el siguiente comando para iniciarlo.
python3
  1. Ahora, importemos el módulo pcost y veamos qué sucede. Cuando usamos la declaración import, Python busca el archivo pcost.py y hace que el código dentro de él esté disponible para que lo usemos.
import pcost

Deberías ver la salida 44671.15. Este es el costo calculado de la cartera del archivo portfolio.dat. Cuando se importa el módulo pcost, el código al final del archivo pcost.py se ejecuta automáticamente.

  1. Intentemos llamar a la función portfolio_cost() con un archivo de cartera diferente. Usaremos la sintaxis pcost.portfolio_cost() para llamar a la función del módulo pcost.
pcost.portfolio_cost('portfolio2.dat')

La salida debe ser 19908.75, que representa el costo total de las acciones en el segundo archivo de cartera.

  1. Ahora, importemos una clase específica del módulo stock. En lugar de importar todo el módulo, podemos importar solo la clase Stock usando la declaración from...import.
from stock import Stock
  1. Después de importar la clase Stock, podemos crear un objeto Stock. Un objeto es una instancia de una clase. Crearemos un objeto Stock con el nombre GOOG, 100 acciones y un precio de 490.10. Luego imprimiremos el nombre de la acción y calcularemos su costo usando el método cost().
s = Stock('GOOG', 100, 490.10)
print(s.name)
print(s.cost())

La salida debe ser:

GOOG
49010.0
  1. Finalmente, cuando hayamos terminado de usar el intérprete de Python, podemos salir de él usando la función exit().
exit()

Este laboratorio ha demostrado dos formas diferentes de importar código de Python:

  • import module_name - Esto importa todo el módulo, haciendo que todas las funciones, clases y variables en ese módulo estén disponibles para su uso.
  • from module_name import specific_item - Esto importa solo un elemento específico (como una clase o una función) del módulo, lo que puede ser útil si solo necesitas una parte de la funcionalidad del módulo.

Comprender el módulo principal en Python

En Python, cuando ejecutas un script directamente, este actúa como el módulo "principal". Python tiene una variable especial llamada __name__. Cuando se ejecuta un archivo directamente, Python establece el valor de __name__ en "__main__". Esto es diferente a cuando el archivo se importa como un módulo.

Esta característica es muy útil porque te permite escribir código que se comporta de manera diferente dependiendo de si el archivo se ejecuta directamente o se importa. Por ejemplo, es posible que desees que cierto código se ejecute solo cuando ejecutas el archivo como un script, pero no cuando es importado por otro script.

Modificar pcost.py para usar el patrón del módulo principal

Modifiquemos el programa pcost.py para aprovechar este patrón.

  1. Primero, debes abrir el archivo pcost.py en el editor. Puedes usar los siguientes comandos para navegar al directorio del proyecto y crear el archivo si no existe:
cd ~/project
touch pcost.py

El comando cd cambia el directorio actual al directorio project en tu directorio principal. El comando touch crea un nuevo archivo llamado pcost.py si no existe.

  1. Ahora, modifica el archivo pcost.py para que se vea así:
## pcost.py

def portfolio_cost(filename):
    total_cost = 0.0

    with open(filename, 'r') as f:
        for line in f:
            fields = line.split()
            try:
                nshares = int(fields[1])
                price = float(fields[2])
                total_cost += nshares * price
            except (ValueError, IndexError):
                print(f"Couldn't parse: {line}")

    return total_cost

## This code only runs when the file is executed as a script
if __name__ == "__main__":
    total = portfolio_cost('portfolio.dat')
    print(total)

El cambio principal aquí es que hemos envuelto el código al final en una condición if __name__ == "__main__":. Esto significa que el código dentro de este bloque solo se ejecutará cuando el archivo se ejecute directamente como un script, no cuando se importe como un módulo.

  1. Después de realizar estos cambios, guarda el archivo y cierra el editor.

Probar el módulo modificado

Ahora, probemos nuestro módulo modificado de dos maneras diferentes para ver cómo se comporta.

  1. Primero, ejecuta el programa directamente como un script usando el siguiente comando:
python3 pcost.py

Debes ver la salida 44671.15, igual que antes. Esto se debe a que cuando ejecutas el script directamente, la variable __name__ se establece en "__main__", por lo que el código dentro del bloque if __name__ == "__main__": se ejecuta.

  1. A continuación, inicia el intérprete de Python nuevamente e importa el módulo:
python3
import pcost

Esta vez, no verás ninguna salida. Cuando importas el módulo, la variable __name__ se establece en "pcost" (el nombre del módulo), no en "__main__". Por lo tanto, el código dentro del bloque if __name__ == "__main__": no se ejecuta.

  1. Para verificar que la función portfolio_cost siga funcionando, puedes llamarla así:
pcost.portfolio_cost('portfolio.dat')

La función debe devolver 44671.15, lo que significa que está funcionando correctamente.

  1. Finalmente, sal del intérprete de Python usando el siguiente comando:
exit()

Este patrón es muy útil cuando se crean archivos de Python que se pueden usar tanto como módulos importables como como scripts independientes. El código dentro del bloque if __name__ == "__main__": solo se ejecuta cuando el archivo se ejecuta directamente, no cuando se importa como un módulo.

Crear tu propio módulo

Ahora que entiendes cómo usar módulos existentes, es hora de crear un nuevo módulo desde cero. Un módulo en Python es un archivo que contiene definiciones y declaraciones de Python. Te permite organizar tu código en piezas reutilizables y manejables. Al crear tu propio módulo, puedes agrupar funciones y variables relacionadas, lo que hace que tu código sea más modular y fácil de mantener.

Crear un módulo de informes

Vamos a crear un módulo simple para generar informes de acciones. Este módulo tendrá funciones para leer un archivo de cartera e imprimir un informe formateado de las acciones en la cartera.

  1. Primero, necesitamos crear un nuevo archivo llamado report.py. Para hacer esto, usaremos la línea de comandos. Navega al directorio project en tu directorio principal y crea el archivo usando el comando touch.
cd ~/project
touch report.py
  1. Ahora, abre el archivo report.py en tu editor de texto preferido y agrega el siguiente código. Este código define dos funciones y un bloque principal.
## report.py

def read_portfolio(filename):
    """
    Read a stock portfolio file into a list of dictionaries with
    keys: name, shares, price
    """
    portfolio = []
    with open(filename, 'r') as f:
        for line in f:
            fields = line.split()
            try:
                stock = {
                    'name': fields[0],
                    'shares': int(fields[1]),
                    'price': float(fields[2])
                }
                portfolio.append(stock)
            except (ValueError, IndexError):
                print(f"Couldn't parse: {line}")
    return portfolio

def print_report(portfolio):
    """
    Print a report showing the stock name, shares, price, and total value
    """
    print("Name    Shares    Price    Value")
    print("-" * 40)
    total_value = 0.0
    for stock in portfolio:
        value = stock['shares'] * stock['price']
        total_value += value
        print(f"{stock['name']:6s} {stock['shares']:9d} {stock['price']:9.2f} {value:9.2f}")
    print("-" * 40)
    print(f"Total Value: {total_value:16.2f}")

if __name__ == "__main__":
    portfolio = read_portfolio('portfolio.dat')
    print_report(portfolio)

La función read_portfolio lee un archivo que contiene información de acciones y devuelve una lista de diccionarios, donde cada diccionario representa una acción con las claves name, shares y price. La función print_report toma una cartera (una lista de diccionarios de acciones) e imprime un informe formateado que muestra el nombre de la acción, el número de acciones, el precio y el valor total. El bloque principal al final se ejecuta cuando el archivo se ejecuta directamente. Lee el archivo de cartera e imprime el informe.

  1. Después de agregar el código, guarda y cierra el editor.

Probar tu módulo

Vamos a probar nuestro nuevo módulo para asegurarnos de que funcione como se espera.

  1. Primero, ejecutaremos el script directamente desde la línea de comandos. Esto ejecutará el bloque principal en el archivo report.py.
python3 report.py

Deberías ver un informe formateado que muestra las acciones de la cartera y sus valores. Este informe incluye el nombre de la acción, el número de acciones, el precio y el valor total, así como el valor total de toda la cartera.

Name    Shares    Price    Value
----------------------------------------
AA         100     32.20   3220.00
IBM         50     91.10   4555.00
CAT        150     83.44  12516.00
MSFT       200     51.23  10246.00
GE          95     40.37   3835.15
MSFT        50     65.10   3255.00
IBM        100     70.44   7044.00
----------------------------------------
Total Value:         44671.15
  1. A continuación, usaremos el módulo desde el intérprete de Python. Inicia el intérprete de Python ejecutando el comando python3 en la terminal.
python3

Una vez que el intérprete esté en funcionamiento, podemos importar el módulo report y usar sus funciones.

import report
portfolio = report.read_portfolio('portfolio.dat')
len(portfolio)  ## Should return 7, the number of stocks
portfolio[0]    ## First stock in the portfolio

La declaración import report hace que las funciones y variables definidas en el archivo report.py estén disponibles en la sesión actual de Python. Luego usamos la función read_portfolio para leer el archivo de cartera y almacenar el resultado en la variable portfolio. La declaración len(portfolio) devuelve el número de acciones en la cartera, y portfolio[0] devuelve la primera acción en la cartera.

Deberías ver la siguiente salida:

7
{'name': 'AA', 'shares': 100, 'price': 32.2}
  1. Ahora, usemos el módulo importado para calcular el costo total de la cartera nosotros mismos. Iteraremos sobre las acciones en la cartera y sumaremos el valor total de cada acción.
total = 0.0
for stock in portfolio:
    total += stock['shares'] * stock['price']
print(total)

La salida debe ser 44671.15, que es el mismo valor total que imprime la función print_report.

  1. Finalmente, creemos un informe personalizado para un tipo de acción específico. Filtraremos la cartera para incluir solo las acciones IBM y luego usaremos la función print_report para imprimir un informe para esas acciones.
ibm_stocks = [stock for stock in portfolio if stock['name'] == 'IBM']
report.print_report(ibm_stocks)

Esto debería imprimir un informe que muestra solo las acciones IBM y sus valores.

Name    Shares    Price    Value
----------------------------------------
IBM         50     91.10   4555.00
IBM        100     70.44   7044.00
----------------
Total Value:         11599.00
  1. Cuando hayas terminado de probar, sal del intérprete de Python ejecutando el comando exit().
exit()

Ahora has creado y usado con éxito tu propio módulo de Python, combinando tanto funciones como un bloque principal que solo se ejecuta cuando el archivo se ejecuta directamente. Este enfoque modular de la programación te permite reutilizar código y hacer que tus proyectos estén más organizados y sean más fáciles de mantener.

Resumen

En este laboratorio, has aprendido los conceptos fundamentales de los módulos de Python y cómo utilizarlos para organizar el código. Los módulos son archivos de Python con código reutilizable, y la declaración import te permite utilizar código de otros módulos en tu programa. El patrón if __name__ == "__main__" permite que los archivos funcionen tanto como módulos importables como como scripts independientes.

Estos conceptos son cruciales para escribir código de Python mantenible, especialmente cuando se desarrollan aplicaciones más grandes. A medida que continúes aprendiendo Python, recuerda que los módulos ayudan a agrupar el código relacionado, importar elementos específicos mantiene el espacio de nombres limpio y el patrón del módulo principal es una buena práctica. Aplicar estas técnicas hará que tu código sea más organizado, mantenible y reutilizable.