Paquetes y módulos

Hasta aquí hemos ejecutado nuestro código en un solo archivo.

no es exactamente así

En realidad cuando usamos algo como from random import ranint estamos usando (importando) código que esta en otros archivos que no vemos (pero podríamos, aquí esta el modulo interno de python random.py).

En la medida que el código que hacemos crece, es necesario mantener un orden. Es por esto que conviene empaquetar el código que hacemos. Esto incluso nos permite reutilizarlo en el futuro.

reutilizar y compartir

Además de reutilizarlo nosotros lo podemos compartir abiertamente. La comunidad de Python es una de las más grandes en el desarrollo de software abierto. Al momento de escribir estas líneas, hay alrededor de 400.000 paquetes abiertos en Pypi (The Python Package Index). Todo este código esta disponible para nosotros.

Podemos pensar a los paquetes Python como carpetas que pueden contener más paquetes (sub-carpetas) y modulos (archivos de Python .py) con funciones y clases para reutilizar.

Para indicar que una carpeta es un paquete alcanza con agregarle un archivo llamado __init__.py. Por el momento alcanza con que este archivo este vacío.

digraph {
    compound=true;
    rankdir="TB";
    labeljust=l;

    base [
            label="Mi código (carpeta)",
            shape="folder",
            fillcolor="#ACA5DD",
            style=filled
        ];
    main [
            fontsize="9",
            fontname="courier-new",
            label="#opciones para importar\limport paquete\lfrom paquete import modulo\lfrom paquete.modulo import mi_funcion",
            shape="component"
        ];
    paquete [
            label="paquete (carpeta)",
            shape="folder"
        ];
    init [
            label="__init__.py",
            shape="file"
        ];
    fn [
        fontsize="9"
        fontname="courier-new"
        label="def mi_funcion():",
        shape="component"
    ]

subgraph cluster_a {
    color="#2344FF"
    label="modulo.py";
    fn
}

subgraph cluster_b {
    color="#2344FF"
    label="mi-programa.py"
    main
}

base -> main [label="contiene a" lhead="cluster_b"];
base -> paquete;
# main -> paquete [label=" import paquete ", style=dashed, arrowhead=true];
paquete -> fn [label="contiene a" lhead="cluster_a"];
paquete -> init;
# main -> fn [label="from paquete\nimport module", style=dashed, lhead="cluster_a"];
# main -> fn [label="from paquete.module\nimport my_function", style=dashed];
}

Estructura de archivos y carpetas

De esta forma es posible mantener el codigo ordenado y facil de mantener a medida que crece.

Tarea

  • Crear un repositorio nuevo en GitHub, clonarlo localmente y agregar dos archivos:

    • auto.py donde vamos a definir nuestra clase Auto

    • programa.py donde vamos a crear objetos de tipo Auto y usarlos para probar su funcionalidad.

    • Finalmente compartir el link del repositorio en el canal del curso.

Ejemplo

_images/class-module-test.png