¿Cuál es la diferencia entre un módulo Python y un paquete Python?

¿Cuál es la diferencia entre un módulo Python y un paquete Python?

Vea también: ¿Cuál es la diferencia entre “paquete” y “módulo” (para otros idiomas)

Un módulo es un solo archivo (o archivos) que se importan bajo una importación y se usan. p.ej

 import my_module 

Un paquete es una colección de módulos en directorios que dan una jerarquía de paquetes.

 from my_package.timing.danger.internets import function_of_love 

Documentación para módulos.

Introducción a los paquetes

Cualquier archivo de Python es un módulo , su nombre es el nombre base del archivo sin la extensión .py . Un paquete es una colección de módulos de Python: mientras que un módulo es un solo archivo de Python, un paquete es un directorio de módulos de Python que contiene un archivo __init__.py adicional, para distinguir un paquete de un directorio que simplemente contiene un montón de Python guiones. Los paquetes se pueden anidar a cualquier profundidad, siempre que los directorios correspondientes contengan su propio archivo __init__.py .

La distinción entre módulo y paquete parece mantenerse solo en el nivel del sistema de archivos. Cuando importa un módulo o un paquete, el objeto correspondiente creado por Python es siempre de tipo module . Sin embargo, tenga en cuenta que cuando importa un paquete, solo las variables / funciones / clases en el archivo __init__.py de ese paquete son directamente visibles, no __init__.py o módulos. Como ejemplo, considere el paquete xml en la biblioteca estándar de Python: su directorio xml contiene un archivo __init__.py y cuatro subdirectorios; el subdirectorio etree contiene un archivo __init__.py y, entre otros, un archivo ElementTree.py . Vea qué sucede cuando intenta importar paquetes / módulos de manera interactiva:

 >>> import xml >>> type(xml)  >>> xml.etree.ElementTree Traceback (most recent call last): File "", line 1, in  AttributeError: 'module' object has no attribute 'etree' >>> import xml.etree >>> type(xml.etree)  >>> xml.etree.ElementTree Traceback (most recent call last): File "", line 1, in  AttributeError: 'module' object has no attribute 'ElementTree' >>> import xml.etree.ElementTree >>> type(xml.etree.ElementTree)  >>> xml.etree.ElementTree.parse  

En Python también hay módulos incorporados, como sys , que están escritos en C, pero no creo que quisieras considerar esos en tu pregunta.

Desde el glosario de Python :

Es importante tener en cuenta que todos los paquetes son módulos, pero no todos los módulos son paquetes. O dicho de otra manera, los paquetes son solo un tipo especial de módulo. Específicamente, cualquier módulo que contenga un atributo __path__ se considera un paquete.

Los archivos de Python con un guión en el nombre, como my-file.py , no se pueden importar con una simple statement de import . En cuanto al código, import my-file es el mismo que import my - file que generará una excepción. Dichos archivos se caracterizan mejor como scripts, mientras que los archivos importables son módulos .

Primero, tenga en cuenta que, en su definición precisa, un módulo es un objeto en la memoria de un intérprete de Python, que a menudo se crea al leer uno o más archivos del disco. Si bien podemos llamar informalmente a un archivo de disco como a/b/c.py a “módulo”, en realidad no se convierte en uno solo hasta que se combina con información de varias otras fonts (como sys.path ) para crear el objeto de módulo. . (Tenga en cuenta, por ejemplo, que dos módulos con nombres diferentes se pueden cargar desde el mismo archivo, dependiendo de sys.path y otras configuraciones).

Un paquete es un módulo que puede tener submódulos (incluidos los subpaquetes). No todos los módulos pueden hacer esto. Como ejemplo, cree una pequeña jerarquía de módulos:

 $ mkdir -pa/b $ touch a/b/c.py 

Asegúrese de que no hay otros archivos en a archivo. Inicie un intérprete de Python 3.4 o posterior (por ejemplo, con python3 -i ) y examine los resultados de las siguientes declaraciones:

 import a a ⇒  ab ⇒ AttributeError: module 'a' has no attribute 'b' import abc ab ⇒  abc ⇒  

Los módulos a y ab son paquetes (de hecho, un cierto tipo de paquete llamado “paquete de espacio de nombres”, aunque no nos preocupemos por eso aquí). Sin embargo, el módulo abc no es un paquete. Podemos demostrar esto agregando otro archivo, a/b.py a la estructura de directorios anterior e iniciando un nuevo intérprete:

 import abc ⇒ ImportError: No module named 'abc'; 'ab' is not a package import ab a ⇒  a.__path__ ⇒ _NamespacePath(['/.../a']) ab ⇒  ab__path__ ⇒ AttributeError: 'module' object has no attribute '__path__' 

Python garantiza que todos los módulos principales se carguen antes de que se cargue un módulo secundario. Arriba, encuentra que a/ es un directorio, y así crea un paquete de espacio de nombres a , y que a/b.py es un archivo fuente de Python que carga y utiliza para crear un módulo ab (que no es un paquete). En este punto, no puede tener un módulo abc porque ab no es un paquete y, por lo tanto, no puede tener submódulos.

También puede ver aquí que el módulo de paquete a tiene un atributo __path__ (los paquetes deben tener esto) pero el módulo de no paquete ab no lo tiene.

Una respuesta tardía, otra definición más:

Un paquete está representado por una entidad superior importada que puede ser un módulo autónomo o el módulo especial __init__.py como la entidad superior de un conjunto de módulos dentro de una estructura de subdirectorio.

Así que físicamente un paquete es una unidad de distribución, que proporciona uno o más módulos.

Así que recuerda en tus libros de texto donde en la página de contenido los capítulos se dividieron en módulos. Así que ahí radica el concepto de diferentes capítulos que tienen el mismo objective o parte de la misma teoría, entonces estas partes se agrupan y se conocen como módulo. De manera similar, en la progtwigción, cuando las diferentes funciones se agrupan, se separan y se denominan como módulo.