Categoria: Programacion Tema: Python Titulo: Modulos y paquetes en python
Fecha del Tema: 2012-09-23 22:52:30Módulos y Paquetes Módulos Para facilitar el mantenimiento y la lectura los programas demasiado largos pueden dividirse en módulos, agrupando elementos relaciona- dos. Los módulos son entidades que permiten una organización y división lógica de nuestro código. Los ficheros son su contrapartida fÃsica: cada archivo Python almacenado en disco equivale a un módulo. Vamos a crear nuestro primer módulo entonces creando un pequeño archivo modulo.py con el siguiente contenido: <? def mi_funcion(): print â??una funcion" class MiClase: def __init__(self): print â??una clase" print â??un modulo" ?> Si quisiéramos utilizar la funcionalidad definida en este módulo en nuestro programa tendrÃamos que importarlo. Para importar un módulo se utiliza la palabra clave import seguida del nombre del módulo, que consiste en el nombre del archivo menos la extensión. Como ejemplo, creemos un archivo programa.py en el mismo directorio en el que guardamos el archivo del módulo (esto es importante, porque si no se encuentra en el mismo directorio Python no podrá encontrarlo), con el siguiente contenido: import modulo Aunque se considera una mala práctica, también es posible importar todos los nombres del módulo al espacio de nombres actual usando el caracter *: from time import * Ahora bien, recordareis que a la hora de crear nuestro primer módulo insistà en que lo guardarais en el mismo directorio en el que se en- contraba el programa que lo importaba. Entonces, Âcómo podemos importar los módulos os, sys o time si no se encuentran los archivos os.py, sys.py y time.py en el mismo directorio? A la hora de importar un módulo Python recorre todos los directorios indicados en la variable de entorno PYTHONPATH en busca de un archivo con el nombre adecuado. El valor de la variable PYTHONPATH se puede consultar desde Python mediante sys.path <? >>> import sys >>> sys.path ?> De esta forma para que nuestro módulo estuviera disponible para todos los programas del sistema bastarÃa con que lo copiáramos a uno de los directorios indicados en PYTHONPATH. En el caso de que Python no encontrara ningún módulo con el nombre especificado, se lanzarÃa una excepción de tipo ImportError. Por último es interesante comentar que en Python los módulos también son objetos; de tipo module en concreto. Por supuesto esto significa que pueden tener atributos y métodos. Uno de sus atributos, __name__, se utiliza a menudo para incluir código ejecutable en un módulo pero que este sólo se ejecute si se llama al módulo como programa, y no al importarlo. Para lograr esto basta saber que cuando se ejecuta el módulo directamente __name__ tiene como valor â??__main__", mientras que cuando se importa, el valor de __name__ es el nombre del módulo: <? print â??Se muestra siempre" if __name__ == â??__main__": print â??Se muestra si no es importacion" ?> Otro atributo interesante es __doc__, que, como en el caso de fun- ciones y clases, sirve a modo de documentación del objeto (docstring o cadena de documentación). Su valor es el de la primera lÃnea del cuerpo del módulo, en el caso de que esta sea una cadena de texto; en caso contrario valdrá None. Paquetes Si los módulos sirven para organizar el código, los paquetes sirven para organizar los módulos. Los paquetes son tipos especiales de módulos (ambos son de tipo module) que permiten agrupar módulos relacio- nados. Mientras los módulos se corresponden a nivel fÃsico con los archivos, los paquetes se representan mediante directorios. En una aplicación cualquiera podrÃamos tener, por ejemplo, un paque- te iu para la interfaz o un paquete bbdd para la persistencia a base de datos. Para hacer que Python trate a un directorio como un paquete es nece- sario crear un archivo __init__.py en dicha carpeta. En este archivo se pueden definir elementos que pertenezcan a dicho paquete, como una constante DRIVER para el paquete bbdd, aunque habitualmente se trata- rá de un archivo vacÃo. Para hacer que un cierto módulo se encuentre dentro de un paquete, basta con copiar el archivo que define el módulo al directorio del paquete. Como los modulos, para importar paquetes también se utiliza import y from-import y el caracter . para separar paquetes, subpaquetes y módulos. <? import paq.subpaq.modulo paq.subpaq.modulo.func() ?>
Módulos y Paquetes Módulos Para facilitar el mantenimiento y la lectura los programas demasiado largos pueden dividirse en módulos, agrupando elementos relaciona- dos. Los módulos son entidades que permiten una organización y división lógica de nuestro código. Los ficheros son su contrapartida fÃsica: cada archivo Python almacenado en disco equivale a un módulo. Vamos a crear nuestro primer módulo entonces creando un pequeño archivo modulo.py con el siguiente contenido: <? def mi_funcion(): print â??una funcion" class MiClase: def __init__(self): print â??una clase" print â??un modulo" ?> Si quisiéramos utilizar la funcionalidad definida en este módulo en nuestro programa tendrÃamos que importarlo. Para importar un módulo se utiliza la palabra clave import seguida del nombre del módulo, que consiste en el nombre del archivo menos la extensión. Como ejemplo, creemos un archivo programa.py en el mismo directorio en el que guardamos el archivo del módulo (esto es importante, porque si no se encuentra en el mismo directorio Python no podrá encontrarlo), con el siguiente contenido: import modulo Aunque se considera una mala práctica, también es posible importar todos los nombres del módulo al espacio de nombres actual usando el caracter *: from time import * Ahora bien, recordareis que a la hora de crear nuestro primer módulo insistà en que lo guardarais en el mismo directorio en el que se en- contraba el programa que lo importaba. Entonces, Âcómo podemos importar los módulos os, sys o time si no se encuentran los archivos os.py, sys.py y time.py en el mismo directorio? A la hora de importar un módulo Python recorre todos los directorios indicados en la variable de entorno PYTHONPATH en busca de un archivo con el nombre adecuado. El valor de la variable PYTHONPATH se puede consultar desde Python mediante sys.path <? >>> import sys >>> sys.path ?> De esta forma para que nuestro módulo estuviera disponible para todos los programas del sistema bastarÃa con que lo copiáramos a uno de los directorios indicados en PYTHONPATH. En el caso de que Python no encontrara ningún módulo con el nombre especificado, se lanzarÃa una excepción de tipo ImportError. Por último es interesante comentar que en Python los módulos también son objetos; de tipo module en concreto. Por supuesto esto significa que pueden tener atributos y métodos. Uno de sus atributos, __name__, se utiliza a menudo para incluir código ejecutable en un módulo pero que este sólo se ejecute si se llama al módulo como programa, y no al importarlo. Para lograr esto basta saber que cuando se ejecuta el módulo directamente __name__ tiene como valor â??__main__", mientras que cuando se importa, el valor de __name__ es el nombre del módulo: <? print â??Se muestra siempre" if __name__ == â??__main__": print â??Se muestra si no es importacion" ?> Otro atributo interesante es __doc__, que, como en el caso de fun- ciones y clases, sirve a modo de documentación del objeto (docstring o cadena de documentación). Su valor es el de la primera lÃnea del cuerpo del módulo, en el caso de que esta sea una cadena de texto; en caso contrario valdrá None. Paquetes Si los módulos sirven para organizar el código, los paquetes sirven para organizar los módulos. Los paquetes son tipos especiales de módulos (ambos son de tipo module) que permiten agrupar módulos relacio- nados. Mientras los módulos se corresponden a nivel fÃsico con los archivos, los paquetes se representan mediante directorios. En una aplicación cualquiera podrÃamos tener, por ejemplo, un paque- te iu para la interfaz o un paquete bbdd para la persistencia a base de datos. Para hacer que Python trate a un directorio como un paquete es nece- sario crear un archivo __init__.py en dicha carpeta. En este archivo se pueden definir elementos que pertenezcan a dicho paquete, como una constante DRIVER para el paquete bbdd, aunque habitualmente se trata- rá de un archivo vacÃo. Para hacer que un cierto módulo se encuentre dentro de un paquete, basta con copiar el archivo que define el módulo al directorio del paquete. Como los modulos, para importar paquetes también se utiliza import y from-import y el caracter . para separar paquetes, subpaquetes y módulos. <? import paq.subpaq.modulo paq.subpaq.modulo.func() ?>