Paquete de Python

Paquete de Python

Package, Package, es una colección de módulos de Python. Desde la perspectiva de la organización de archivos, un paquete es una carpeta con varios módulos (archivos .py) y subcarpetas (subpaquetes). El nombre del paquete crea un espacio de nombres para el módulo Python. Por ejemplo, el nombre del módulo AB representa un submódulo llamado B en el paquete A Este tipo de nombre de módulo se puede usar para hacer que el nombre del módulo en el paquete que escriba igual que el nombre del módulo en otros paquetes de software, pero no entren en conflicto entre sí.

Para una castaña, tenemos que diseñar una colección de módulos (un paquete) que maneje imágenes. Sabemos que las imágenes vienen en muchos formatos de archivo diferentes, y generalmente se identifican mediante diferentes extensiones, como .jpg , .png , .gif etc. Para poder leer y escribir imágenes en diferentes formatos, debe crear un módulo correspondiente para cada formato a procesar. Para admitir más formatos de imagen, debe agregar más módulos correspondientes. Es posible que tenga más procesamiento para las imágenes, como cambiar colores, recortar, rotar, etc. Para implementar estas funciones, debe escribir más módulos. De esta manera, la estructura de su paquete se expresa en la forma de un sistema de archivos de la siguiente manera:
image            # Paquete superior
├── __init__.py  # Inicializar el paquete de imágenes.
├── formats      # Subpaquete de formato de imagen
│   ├── gif_read.py
│   ├── gif_write.py
│   ├── __init__.py
│   ├── jpg_read.py
│   ├── jpg_write.py
│   ├── png_read.py
│   └── png_write.py
└── process      # Subpaquete para procesamiento de imágenes
    ├── colors.py
    ├── crop.py
    ├── __init__.py
    └── rotate.py
Para que el directorio sea un paquete de Python, el directorio debe contener un archivo __init__.py , que puede ser un archivo vacío pero no puede existir. El propósito de esto es ocultar inadvertidamente los módulos válidos que están detrás de la ruta de búsqueda del módulo, siguiendo un directorio con un nombre genérico. Por ejemplo, si tiene un directorio de time en su directorio actual, puede poner recursos del programa. No hay __init__.py archivo __init__.py en él. Es un directorio ordinario. Si Python no requiere que el archivo __init__.py esté incluido en el directorio del paquete, ocultará el módulo de tiempo del sistema Python.

__all__ variable

Como se mencionó anteriormente, el directorio del paquete debe contener un archivo __init__.py , que puede ser un archivo vacío, o puede escribir el paquete para inicializar el código relevante, o definir la variable __all__ .
__all__ variable __all__ es una lista de los nombres de los submódulos contenidos en este paquete. Cuando se ejecuta la instrucción from package import * , se from package import * el nombre del módulo en la lista de nombres de módulos. Entonces __all__ es el índice de visualización de un paquete. Si considera que no es necesario utilizar la operación de importar * del paquete, tampoco puede definir la variable __all__ .
Por ejemplo, la imagen del archivo / proceso / init .py puede contener el siguiente código:
__all__ = ['colors', 'crop', 'rotate']
Después de definir __all__ , from image.process import * colors , crop , rotate en el espacio de nombres actual.
En la práctica de escribir realmente el código, la práctica de import * está estrictamente prohibida, y es fácil hacer que el nombre del módulo en el paquete entre en conflicto con el nombre del espacio de nombres actual.
El método más recomendado es from package import submodule o from package import submodule as alias_for_submodule . Por supuesto, si hay submódulos con el mismo nombre en ambos paquetes, no puede usarlos from package import submodule al mismo tiempo, pero puede tomar nombres individuales.

Importar paquetes de Python o submódulos de Python

El método para importar un paquete es el mismo que para importar un módulo:
import image
Al referirse al submódulo de colors en el programa:
 image.process.colors(...) 
A continuación, veamos cómo importamos un único módulo en un paquete:
 import image.process.colors 
Esto carga el submódulo image.process.colors y debe usar su nombre completo cuando se usa en el programa en lugar de colors simples.
Si desea usar los colors nombre, use esta declaración de importación:
 from image.process import colors 

Referencia de subpaquete Python

Cuando hay subpaquetes (similares al paquete de imágenes en el ejemplo), podemos usar importaciones absolutas para hacer referencia a los submódulos del paquete hermano. Por ejemplo, si el módulo image.process.crop necesita usar el módulo jpg_read en el paquete image.formats, puede usar from image.formats import jpg_read .
También podemos from module import name el formulario de from module import name del from module import name . Esta importación utiliza un punto inicial para indicar los Paquete actual y Paquete para padres involucrados en la importación relativa. Por ejemplo, en el módulo de recorte, puede utilizar:
from . import colors
from .. import formats
from ..formats import jpg_read
Principalmente, la importación relativa se basa en el nombre del módulo actual. Dado que el nombre del módulo principal (es decir, el archivo .py ejecutado por python) siempre es "__main__" , el módulo utilizado como módulo principal de la aplicación de Python debe importarse absolutamente. En otras palabras, el programa principal que se está ejecutando no puede contener importaciones relativas . Esto es muy importante, recuerda!

留言