Módulos

Los módulos son el modo en que Python organiza el código para su reutilización (muy similar a las librerías). La librería define automáticamente un espacio de nombres con el mismo nombre. Para hacer disponible una librería se utiliza import:


In [1]:
import math
math.cos(0)


Out[1]:
1.0

Se puede importar un módulo con un nombre diferente por comodidad o para evitar un conflicto de nombres:


In [2]:
import multiprocessing as multiproc
dir(multiproc)
multiproc.cpu_count()


Out[2]:
8

Es posible importar únicamente los símbolos que se necesitan:


In [3]:
from math import cos, sin
cos(0)


Out[3]:
1.0

Por útimo, existe la posibildad de importar todos los símbolos de un módulo. Esto está desaconsejado porque produce «contaminación del espacio de nombres» (namespace pollution).


In [4]:
from sys import *
version_info


Out[4]:
sys.version_info(major=2, minor=7, micro=7, releaselevel='final', serial=0)

Crear un módulo

Para crear un nuevo módulo basta escribir un fichero que incluya una serie de funciones, variables o clases y colocarlo en la ruta de búsqueda de Python: PYTHONPATH


In [5]:
path


Out[5]:
['',
 '/home/david/repos/qoogol',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-i386-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gst-0.10',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/pymodules/python2.7',
 '/usr/lib/python2.7/dist-packages/IPython/extensions']

In [4]:
!cat code/factorial.py


#!/usr/bin/env python
# -*- mode:python; coding:utf-8; tab-width:4 -*-

def factorial(n):
    if n == 0:
        return 1

    return n * factorial(n - 1)

In [22]:
import sys
sys.path.append("./code")

import factorial
factorial.factorial(50)


Out[22]:
30414093201713378043612608166064768844377641568960512000000000000L

Programa principal de un módulo

Cuando un fichero Python tiene código en la primera columna funciona como una función principal. Al importar ese fichero, ese código se ejecutará. Si queremos que ese código se ejecuta únicamente cuando se lanza específicamente ese fichero (y no al importarlo) se puede hacer lo siquiente:


In [1]:
if __name__ == '__main__':
    pass  # código que no se ejecuta con "import"