Historia del tema
Los Namespaces (espacios de nombres) son una de las conceptos básicos de Python, presentes desde las primeras implementaciones del lenguaje. Están diseñados para sistematizar los nombres, evitando conflictos entre variables, funciones y clases de diferentes partes del programa.
Problema
En proyectos grandes aparecen muchas funciones, clases, variables y módulos. Sin el uso correcto de los namespaces, es posible sobrescribir nombres importantes, obtener sombras inesperadas de variables y enfrentar dificultades en la prueba y expansión.
Solución
En Python, un namespace es un mapeo que vincula nombres a objetos. Existen diferentes niveles de espacios de nombres: local, global, módulos y clases. Comprender esta división garantiza el acceso correcto a los objetos necesarios y minimiza los conflictos.
Ejemplo de código:
def foo(): x = 10 # x en el espacio de nombres local de la función print(x) y = 20 # y en el espacio de nombres global del módulo foo() print(y)
Características clave:
¿Qué sucederá si se declara una variable local en la misma función con el mismo nombre que una global?
La local "opacará" a la global durante la ejecución de la función; fuera de la función, la global permanecerá inalterada.
a = 1 def test(): a = 2 print(a) # 2 test() print(a) # 1
¿Cómo obtener una lista de todos los nombres en el espacio de nombres actual?
Las funciones locals(), globals(), dir() devuelven los mapeos o listas de nombres correspondientes en el ámbito/namespace actual.
¿En qué se diferencian los espacios de nombres de clases y de instancias?
El namespace de clase define atributos comunes para todas las instancias de la clase. El namespace de instancia contiene atributos específicos de un objeto concreto. Los cambios en la instancia no afectan a la clase, y viceversa.
Se usó from mymodule import * en todas partes de un gran proyecto. Como resultado, los nombres de las funciones se sobrescribieron, surgiendo errores difíciles de detallar debido a conflictos de nombres entre paquetes.
Pros:
Contras:
Se cambiaron a alias de importaciones (import mymodule as mm), estructuración clara de módulos.
Pros:
Contras: