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.