En Python, un espacio de nombres (namespace) es un diccionario que mapea nombres a objetos. Los niveles de espacios de nombres son: local, global y built-in. Los módulos son espacios separados para organizar el código. Al importar, Python crea un nuevo espacio de nombres para cada módulo.
import module — importa el módulo y se accede a los objetos a través de module.name.from module import name — importa un objeto del módulo directamente al espacio actual (riesgo de conflictos de nombres).as — permite establecer un alias.Para evitar conflictos de nombres:
import mymodule), en lugar de un asterisco (from... import *).__init__.py).import module as m).project/
package/
__init__.py
module1.py
module2.py
import package.module1 from package.module2 import function as fn
Pregunta: ¿Qué diferencia hay al importar un módulo dos veces? ¿Se ejecutará todo el código del módulo nuevamente?
Respuesta: No. Al primer import, el módulo se ejecuta y el resultado se almacena en sys.modules. La importación posterior devuelve el objeto del módulo ya cargado, su código no se ejecuta nuevamente.
# module.py print('¡Hola!') # main.py import module # mostrará ¡Hola! import module # no mostrará nada
Historia
from settings import * en varios módulos, como resultado al cambiar configuraciones, inesperadamente "se sobrescribieron" las variables locales, causando errores difíciles de detectar.Historia
utils.py). En la etapa de integración, los módulos con nombres "iguales" se "intercambiaron" entre sí, lo que llevó a comportamientos inesperados y errores complejos.Historia
En una de las bibliotecas, intentaron "reimportar en caliente" un módulo con nuevas configuraciones a través de importlib.reload. No tuvieron en cuenta que otros módulos ya importados conservaron las referencias antiguas a los objetos, por lo que los cambios no se aplicaron en todas las partes de la aplicación.