Módulos de Python con submódulos y funciones.

Tuve una pregunta sobre cómo funcionan las bibliotecas como numpy. Cuando importo numpy , se me da acceso a una gran cantidad de clases, funciones y constantes numpy.array como numpy.array , numpy.sqrt , etc.

Pero dentro de numpy hay submódulos adicionales como numpy.testing.

¿Cómo se hace esto? En mi experiencia limitada, los módulos con submódulos son simplemente carpetas con un archivo __init__.py , mientras que los módulos con funciones / clases son archivos reales de Python. ¿Cómo se crea una “carpeta” de módulo que también tiene funciones / clases?

Una carpeta con archivos .py y un __init__.py se denomina package . Uno de esos archivos que contienen clases y funciones es un module . La anidación de carpetas puede darle subpaquetes.

Así por ejemplo si tuviera la siguiente estructura:

  mypackage __init__.py module_a.py module_b.py mysubpackage __init__.py module_c.py module_d.py 

Podría importar mypackage.module_a o mypackage.mysubpacakge.module_c y así sucesivamente.

También puede agregar funciones a mypackage (como las funciones numpy que mencionó) colocando ese código en __init__.py . Aunque esto generalmente se considera feo.

Si observas __init__.py de __init__.py , verás un montón de código allí. Mucho de esto es la definición de estas funciones y clases de nivel superior. El código __init__.py es lo primero que se ejecuta cuando se carga el paquete.