Crear e importar módulos en Python

En Python, un módulo es un archivo autónomo con declaraciones y definiciones de Python. Por ejemplo, archivo.py, puede considerarse un módulo llamado archivo. Esto difiere...

Introducción

En Python, un módulo es un archivo autónomo con declaraciones y definiciones de Python. Por ejemplo, file.py, puede considerarse un módulo llamado file. Esto difiere de un paquete en que un paquete es una colección de módulos en directorios que dan estructura y jerarquía a los módulos.

Los módulos nos ayudan a dividir programas grandes en archivos pequeños que son más manejables. Con los módulos, la reutilización del código se convierte en una realidad. Supongamos que tenemos una función que se usa con frecuencia en diferentes programas. Podemos definir esta función en un módulo y luego importarla a los distintos programas sin tener que copiar su código cada vez.

En este artículo, veremos cómo crear módulos Python y cómo usarlos en código Python.

Módulos de escritura {#modulos de escritura}

Un módulo es simplemente un archivo de Python con la extensión .py. El nombre del archivo se convierte en el nombre del módulo. Dentro del archivo, podemos tener definiciones e implementaciones de clases, variables o funciones. Estos se pueden usar en otros programas de Python.

Comencemos por crear una función que simplemente imprima "Hello World". Para hacer esto, cree un nuevo archivo de Python y guárdelo como hello.py. Agregue el siguiente código al archivo:

1
2
def my_function():
    print("Hello World")

Si ejecuta el código anterior, no devolverá nada. Esto se debe a que no le hemos dicho al programa que haga nada. Es cierto que hemos creado una función llamada my_function() dentro del código, pero no hemos llamado ni invocado la función. Cuando se invoca, esta función debe imprimir el texto "Hello World".

Ahora, vaya al mismo directorio donde guardó el archivo anterior y cree un nuevo archivo llamado main.py. Agregue el siguiente código al archivo:

1
2
3
import hello

hello.my_function()

Producción

1
Hello World

La función se invocó con éxito. Comenzamos importando el módulo. El nombre del archivo era hello.py, por lo que el nombre del módulo importado es hello.

Además, tenga en cuenta la sintaxis que hemos utilizado para invocar la función. Esto se llama "notación de puntos", que nos permite llamar a la función especificando primero el nombre del módulo y luego el nombre de la función.

Sin embargo, esa es solo una forma de importar el módulo e invocar la función. Podríamos haberlo hecho de la siguiente manera:

1
2
3
from hello import my_function

my_function()

Producción

1
Hello World

En el ejemplo anterior, la primera línea ordena al intérprete de Python que importe una función llamada my_function desde un módulo llamado hello. En tal caso, no tiene que usar la notación de puntos para acceder a la función, simplemente puede llamarla directamente.

Sin embargo, en el caso de que nuestro módulo hola tenga varias funciones, la declaración desde hola importa mi_función no importará todas las funciones de hola a nuestro programa, solo mi_función. Si intenta acceder a cualquier otra función, se generará un error. Tienes que importar todo el módulo o importar cada función individual para usarlas.

Podemos definir una variable dentro de un módulo, que luego puede ser utilizada por otros módulos. Para demostrar esto, abra el archivo hello.py y agréguele el siguiente código:

1
2
3
4
5
def my_function():
    print("Hello World")

# The variable that'll be used in other modules
name = "Nicholas"

Ahora, abra el archivo main.py y modifíquelo de la siguiente manera:

1
2
3
4
5
import hello

hello.my_function()

print(hello.name)

Producción

1
2
Hello World
Nicholas

Hemos invocado con éxito tanto la función como la variable definida en el módulo, ya que importamos todo el módulo en lugar de solo la función my_function().

Dijimos anteriormente que podemos definir una clase dentro de un módulo. Veamos cómo hacer esto en el siguiente ejemplo. Abra el archivo hello.py y modifíquelo de la siguiente manera:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def my_function():
    print("Hello World")

# Defining our variable
name = "Nicholas"

# Defining a class
class Student:
    def __init__(self, name, course):
        self.course = course
        self.name = name

    def get_student_details(self):
        print("Your name is " + self.name + ".")
        print("You are studying " + self.course)

Aquí hemos definido una clase llamada Student. En esta clase se han definido dos variables, nombre y curso. El método get_student_details() también se ha definido dentro de este, que imprime los detalles del estudiante en la consola.

Ahora, abra el archivo main.py y modifíquelo de la siguiente manera:

1
2
3
4
5
6
7
8
import hello

hello.my_function()

print(hello.name)

nicholas = hello.Student("Nicholas", "Computer Science")
nicholas.get_student_details()

Producción

1
2
3
4
Hello World
Nicholas
Your name is Nicholas.
You are studying Computer Science

En el script anterior, nuevamente usamos la notación de puntos para crear un objeto de la clase student del módulo hello. Luego usamos la función get_student_details() para obtener los detalles del estudiante.

Aunque los módulos consisten principalmente en definiciones de clase (en la mayoría de los casos), también es posible que ejecuten su propio código cuando se importan. Para demostrar esto, modifiquemos el archivo hello.py, donde tenemos una definición de la función my_function(), junto con la llamada a la función:

1
2
3
4
def my_function():
    print("Hello World")
    
my_function()

Ahora, abra el archivo main.py y elimine todas las líneas excepto las siguientes:

1
import hello

Producción

1
Hello World

El resultado anterior muestra que definimos y llamamos a la función dentro del módulo. Cuando se importa el módulo, devuelve directamente el resultado de la función sin tener que invocar la función. Este comportamiento no siempre es el deseado, pero es útil para ciertos casos de uso, como la carga previa de datos desde la memoria caché cuando se importa el módulo.

Importación de todos los objetos del módulo

Para importar todos los objetos (funciones, variables, clases, etc.) desde un módulo, podemos usar la instrucción importar *. Por ejemplo, para importar todos los objetos contenidos en el módulo hola, podemos usar la siguiente declaración:

1
from hello import *

Después de agregar la declaración anterior a un programa, podremos usar cualquier función, variable o clase contenida en el módulo hola sin tener que anteponer hola.

Acceder a un módulo desde otra ruta {#acceder a un módulo desde otra ruta}

En Python, los módulos se usan en más de un proyecto. Por lo tanto, no tiene sentido si mantiene sus módulos en el directorio de uno de los proyectos, ya que otros proyectos no podrían usarlo tan fácilmente.

Tiene un par de opciones cada vez que necesita acceder a un módulo que no está almacenado en el mismo directorio que su programa. Discutamos esto en las próximas secciones:

Agregar rutas

Para importar un módulo desde otra ruta, primero debe importar el módulo sys, así como cualquier otro módulo de Python que le gustaría usar en su programa.

El módulo sys lo proporciona la biblioteca estándar de Python y proporciona funciones y parámetros que son específicos del sistema. La función path.append() del módulo sys se puede usar para agregar la ruta del módulo al proyecto actual.

Para demostrar esto, corte el archivo hello.py del directorio donde tiene el archivo main.py. Pégalo en otro directorio. En mi caso lo he pegado en el directorio "F:\Python."

Ahora, abra el archivo main.py, importe el módulo sys y especifique la ruta en la que el intérprete de Python buscará los archivos. Esto se demuestra a continuación:

1
2
3
4
import sys
sys.path.append('F:/Python/')

import hello

Producción

1
Hello World

En el script anterior, la línea sys.path.append('F:/Python/') le dice al intérprete de Python que incluya esta ruta en la lista de rutas que se buscarán al importar los módulos.

Adición de un módulo a la ruta de Python

El método anterior solo funciona si importa el módulo sys. Si no importa el módulo sys y especifica la ruta al módulo, se generará un error. Para que el módulo esté disponible para todo el sistema, puede agregarlo a la ruta donde Python normalmente busca módulos y paquetes. De esta forma, no tendrás que importar el módulo sys y especificar la ruta al módulo como hemos hecho en la sección anterior.

Antes de hacer cualquier otra cosa, primero debe identificar la ruta en la que Python busca módulos y paquetes. Simplemente abra la línea de comando de su sistema operativo y ejecute el comando python. Esto lo llevará a la terminal de Python.

Importe el módulo sys de la siguiente manera:

1
import sys

A continuación, puede ejecutar el siguiente comando para imprimir la ruta:

1
print(sys.path)

La salida contendrá al menos una ruta del sistema. Si lo haces desde un entorno de programación, obtendrás varios caminos. En mi caso, obtuve lo siguiente:

1
2
3
4
5
6
7
8
$ python
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/Library/Python/2.7/site-packages/six-1.10.0-py2.7.egg', '/Library/Python/2.7/site-packages/cffi-1.2.1-py2.7-macosx-10.9-intel.egg', '/Library/Python/2.7/site-packages/pycparser-2.14-py2.7.egg', '/Library/Python/2.7/site-packages/virtualenv-13.1.2-py2.7.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/Library/Python/2.7/site-packages']
>>> 

Su objetivo debe ser encontrar el que está en el entorno que está utilizando actualmente. Deberías buscar algo como lo siguiente:

1
/Library/Python/2.7/site-packages

Mueva su archivo hello.py a la ruta. Después de eso, podrá importar el módulo hola desde cualquier directorio de la forma habitual, como se muestra a continuación:

1
import hello

Producción

1
Hello World

Conclusión

Esto marca el final de este artículo. Un módulo es simplemente un archivo de Python con un conjunto de variables y definiciones de funciones. Un módulo facilita la reutilización del código ya que puede definir una función en un módulo e invocarla desde diferentes programas en lugar de tener que definir la función en cada programa. Aunque un módulo se usa principalmente para definiciones de funciones y clases, también puede exportar variables e instancias de clases.

Licensed under CC BY-NC-SA 4.0